2016-09-23 4 views
1

Мое приложение добавляет несколько Runnable в поток FX, вызывая метод Platform.runlater, затем я хочу сделать некоторые вычисления только в том случае, если в очереди FX Platform нет дополнительных Runnable. Но я не знаю правильного пути, есть ли какое-либо событие или механизм обратного вызова, чтобы получить нужное время?
В настоящее время я заставляю прикладную нить беспорядочно спать МИЛЛИЗИРОВАННЫМИ.JavaFX, есть ли обратный вызов для Platform.runlater()?

+0

Я не уверен, что вы пытаетесь достичь. Вся ваша обработка начинается с обратной линии? Platform.runlater запустит код в приложении JavaFX Application Thread вместе с любыми событиями GUI. Я не думаю, что вы можете контролировать графические интерфейсы, кроме как явно заблокировать интерфейс ... – Puce

+0

Еще некоторое описание будет оценено (что вы хотите сделать). Почему вам придется ждать JavaFX, чтобы завершить рендеринг, прежде чем выполнять вычисления? Как проблема случайной нити решала проблему? – GOXR3PLUS

+0

Если вы можете отменить процесс и начать с приложения JavaFX Application Thread, вы можете использовать служебные классы в http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/package-summary.html для запуска кода в фоновом потоке. – Puce

ответ

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

} 
Смежные вопросы