We have a use case where we receive a LOT of processing orders in one Thread in a TCP socket and we have to perform the drawing in the JavaFX Thread, but also we must wait until the effective drawing has finished before ordering a new drawing (because otherwise some parameters could have changed in the middle of the drawing so the rsulting image could be inconsistent). We use Platform.runLater with a future in our case like: FutureTask<?> future = new FutureTask<>(runnable, null); Platform.runLater(future); try { future.get(); return true; } catch...
I don't know if this is a valid pattern. Of course the Thread which handle this code has to be different from the Thread which handle the socket reception in our case. Hervé 2016-11-02 22:13 GMT+01:00 Kevin Rushforth <kevin.rushfo...@oracle.com>: > We use runAndWait (using a CountDownLatch) in many of our unit tests. You > might take a look at: > > tests/system/src/test/java/test/util/Util.java > > Its runAndWait method also handles propagating runtime exceptions and > errors (e.g., assertion failures) from the body of the runAndWait back to > the caller. > > -- Kevin > > > Benjamin Gudehus wrote: > >> I wonder, if it is possible to test JavaFX applications without blocking >> the main thread. User interactions could be completely simulated by using >> Event.fireEvent(...) and we could enqueue assertions in the JavaFX >> application thread, in which case the assertion library needs to support >> asynchronous assertions. >> >> On Wed, Nov 2, 2016 at 9:02 PM, Stefan Fuchs <snfu...@gmx.de <mailto: >> snfu...@gmx.de>> wrote: >> >> 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 <mailto: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/ >> <http://hg.openjdk.java.net/openjfx/9-dev/rt/file/> >> 6edd0c3c01f4/modules/javafx.gr >> <http://javafx.gr>aphics/src/main/java/javafx/ >> application/Platform.java#l148 >> >> --Benjamin >> >> >> >> >>