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