JavaFX 9: Expose PlatformImpl.runAndWait() as Platform.runAndWait()

Kevin Rushforth kevin.rushforth at oracle.com
Wed Nov 2 21:13:37 UTC 2016


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 <snfuchs at gmx.de 
> <mailto:snfuchs at 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.rushforth at oracle.com <mailto:kevin.rushforth at 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
>
>
>
>


More information about the openjfx-dev mailing list