Hi,
in my experience blocking your working thread for the JavaFX application
thread is almost always a sign of bad application design.
You can easily deadlock your application. In our quite complex JavaFX
Application, we could eliminate almost all of its uses.
However, in one case it is still needed: In a thread we sequentially
prepare several images in the background, create a snapshot and save
them as jpegs.
Here we use java.util.concurrent.CountDownLatch to simulate
PlatformImpl.runAndWait.
final WritableImage image = new WritableImage((int)
targetWidth, (int) targetHeight);
final CountDownLatch countDownLatch = new CountDownLatch(1);
Platform.runLater(() -> {
/* render and snapshot image */
countDownLatch.countDown();
});
boolean released = countDownLatch.await(10, TimeUnit.SECONDS);
if (!released) {
Logger.getLogger(getClass()).error("Timeout reached, while
waiting for snapshot");
return null;
}
return image;
What I would like to see implemented is a method, we call runNowOrLater.
That is, if I'm on the JavaFX ApplicationThread execute the Runnable
immediately, if not call Platform.runLater().
With this method I have not to worry, if I'm on the JavaFX Application
thread or not and I avoid flooding the event queue with calls to
Platform.runLater, that could have been executed directly.
So basically:
public static void runNowOrLater(final Runnable runnable) {
if (Platform.isFxApplicationThread()) {
runnable.run();
} else {
Platform.runLater(runnable);
}
}
-- Stefan
Hi, Kevin. Thanks for the info!
On Wed, Nov 2, 2016 at 5:36 PM, Kevin Rushforth <kevin.rushfo...@oracle.com>
wrote:
No. This isn't something we will do for JDK 9, which is feature complete
(with an exception process for critical requests, especially relating to
Jigsaw). I note in this case that it isn't clear whether we want to do this
one at all.
-- Kevin
Benjamin Gudehus wrote:
Hey!
Are there plans to expose this API [1] in JavaFX 9?
// NOTE: Add the following if we decide to expose it publicly
// public static void runAndWait(Runnable runnable) {
// PlatformImpl.runAndWait(runnable);
// }
[1] http://hg.openjdk.java.net/openjfx/9-dev/rt/file/
6edd0c3c01f4/modules/javafx.graphics/src/main/java/javafx/
application/Platform.java#l148
--Benjamin