JavaFX,Platform.runlater()有没有回调?

时间:2016-09-23 05:36:18

标签: javafx testfx

我的应用程序通过调用Runnable方法在FX线程上添加了多个Platform.runlater,然后,我想在FX平台队列中没有其他Runnable的情况下进行一些计算。 但我不知道正确的方法,是否有任何事件或回调机制来获得合适的时间? 目前我强制应用程序线程随机睡眠MILLISECONDS。

1 个答案:

答案 0 :(得分:4)

从一开始就是一个坏主意,因为您不知道其他代码使用了什么Platform.runLater。此外,您不应该依赖此类实施细节;所有你知道的队列永远不会是空的 但是,您可以使用跟踪Runnable的数量的自定义类发布这些Runnable,并在完成所有操作后通知您:

public class UpdateHandler {
     private final AtomicInteger count;
     private final Runnable completionHandler;

     public UpdateHandler(Runnable completionHandler, Runnable... initialTasks) {
         if (completionHandler == null || Stream.of(initialTasks).anyMatch(Objects::isNull)) {
             throw new IllegalArgumentException();
         }
         count = new AtomicInteger(initialTasks.length);
         this.completionHandler = completionHandler;
         for (Runnable r : initialTasks) {
             startTask(r);
         }
     }

     private void startTask(Runnable runnable) {
         Platform.runLater(() -> {
             runnable.run();
             if (count.decrementAndGet() == 0) {
                 completionHandler.run();
             }
         });
     }

     public void Runnable runLater(Runnable runnable) {
         if (runnable == null) {
             throw new IllegalArgumentException();
         }
         count.incrementAndGet();
         startTask(runnable);
     }

}