2

私のアプリケーションは、メソッドRunnableを呼び出して FX スレッドに複数を追加します。その後、FX プラットフォーム キューにPlatform.runlater追加がない場合にのみ、いくつかの計算を実行したいと考えています。Runnableしかし、正しい方法がわかりません。適切な時間を取得するためのイベントまたはコールバックメカニズムはありますか?
現在、アプリケーション スレッドを強制的に MILLISECONDS ランダムにスリープさせています。

4

1 に答える 1

4

他のコードが何を使用しているかがわからないため、これは最初から悪い考えですPlatform.runLater。また、そのような実装の詳細に依存するべきではありません。キューが空になることはありません。ただし、 の数を追跡し、すべてが完了したときに通知するカスタム クラスを使用して、
これらの を投稿できます。RunnableRunnable

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 に答える