Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Platform.runLater not check if it currently is on the JavaFX thread?

Tags:

When using JavaFX 8, we need to run interactions with the GUI via Platform.runLater, or else they will throw exceptions if ran from another thread.

However the implementation of Platform.runLater never checks whether it currently is on the JavaFX thread.

I wrote the following method:

public static void runSafe(final Runnable runnable) {     Objects.requireNonNull(runnable, "runnable");     if (Platform.isFxApplicationThread()) {         runnable.run();     }     else {         Platform.runLater(runnable);     } } 

This ensures that it can never be run on a non-fx-application thread.

Is there any reason that the default implementation does not do this kind of short-circuiting?

like image 854
skiwi Avatar asked Jun 04 '14 17:06

skiwi


People also ask

What does the method platform runLater () do?

runLater. Run the specified Runnable on the JavaFX Application Thread at some unspecified time in the future. This method, which may be called from any thread, will post the Runnable to an event queue and then return immediately to the caller.

Why is JavaFX not thread safe?

Thread safety in a JavaFX application cannot be achieved by synchronizing thread actions. We must ensure that the programs that manipulate the scene graph must do so only from the JavaFX Application Thread. Therefore, multithreading in JavaFX has to be handled in a different manner.

Does JavaFX use threads?

JavaFX uses a single-threaded rendering design, meaning only a single thread can render anything on the screen, and that is the JavaFX application thread. In fact, only the JavaFX application thread is allowed to make any changes to the JavaFX Scene Graph in general.


2 Answers

runLater essentially places your Runnable in a queue for execution when the FX thread is available. The method can be accessed through non-FX threads. Imagine that some other threads have placed tasks in the runLater queue, then calling runLater again, whether from the FX thread or not, should place the new task at the tail of that queue.

With the short-circuiting you propose the previous tasks would basically have a lower priority which may not be desirable.

like image 182
assylias Avatar answered Oct 19 '22 14:10

assylias


When calling a function, and the function is called 'runLater', I would expect it to be run later, not now.

It seems to me that the implementation is doing the right thing, based on it's name, and it's documentation:

Run the specified Runnable on the JavaFX Application Thread at some unspecified time in the future.

This method, which may be called from any thread, will post the Runnable to an event queue and then return immediately to the caller. The Runnables are executed in the order they are posted. A runnable passed into the runLater method will be executed before any Runnable passed into a subsequent call to runLater

If you don't want the code to run later, don't ask for it to be run later. That is what you have essentially done with your code.

like image 42
rolfl Avatar answered Oct 19 '22 16:10

rolfl