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
>>
>>
>>
>>
>>

Reply via email to