2

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

4

1 回答 1

4

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

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);
     }

}
于 2016-09-23T09:41:30.577 回答