我们知道,我们可以在新线程中运行javafx UI更新,并支持javaFX Application线程。
new Thread(new Runnable() {
@Override
public void run() {
Platform.runLater(new Runnable() {
@Override
public void run() {
//UI Stuff
}
});
}
}).start();
当我们开始两个UI更新时,让我们考虑在两个不同的线程中处理两个阶段。
新线程(...... updateUI(的stage1)
新线程(...... updateUI(stage2的)
updateUI方法将是这样的。
void updateUI(Stage stage) {
Platform.runLater(new Runnable() {
@Override
public void run() {
//UI Stuff
}
});
}
问题是两个阶段永远不会同时更新。我认为他们都在Platform.runLater中使用相同的javafx应用程序线程。
我想同时更新这两个阶段。我该怎么做(我们知道可以在AWT中运行几个UI线程并使用JavaFX进行摆动)?
答案 0 :(得分:2)
您无法控制JavaFX的线程系统,从应用程序的角度来看,它是单线程的。
JavaFX应用程序线程由JavaFX系统创建。在JavaFX architecture overview中了解其工作原理。更多背景信息在以下答案中:Javafx: Difference between javafx.concurent and Platform.runLater?和Multithreaded toolkits: A failed dream?
对您问题中其他要点的评论
当你说"我们可以在一个新线程中运行javafx UI更新",这不是真的,因为你正在调用Platform.runLater,它将工作转移到JavaFX应用程序线程,所以你并没有真正在新线程中运行更新。你还说当你从多个线程调用Platform.runLater时#34;问题是两个阶段永远不会同时更新" - 这正是Platform.runLater的文档所说的将会做的事情"在未来某个未指定的时间在JavaFX应用程序线程上运行指定的Runnable" - 因此,当您使用Platform.runLater时,没有顺序保证。
我想同时更新这两个阶段
不是创建自己的线程,而是在JavaFX应用程序线程上顺序执行的代码中更新两个阶段的场景图(例如,在start方法或应用程序的事件处理程序中)。一旦您的应用程序在JavaFX应用程序线程上执行指令,所有应用程序指令将在下一个"脉冲之前执行。渲染修改后的场景图的JavaFX线程 - 因此从用户的角度来看,当脉冲呈现它们时,两个阶段将同时更新。默认情况下,JavaFX将每秒发出60次渲染脉冲。如果你在JavaFX应用程序线程上做了很多工作,那么在下一个脉冲发生之前会有一个暂停(这就是为什么建议你在不到六十分之一秒内完成所有工作)。
如果你需要做很多工作(例如一些I / O或计算成本极高的任务,需要花费四分之一秒或更长时间),你需要使用前面提到的JavaFX并发工具来确保你没有冻结你的用户界面,只有在所有并发任务完成后才更新用户界面 - 在答案中展示了各种技巧:How to reset progress indicator between tasks in JavaFX2?