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