如何在实际的不同线程中运行两个JavaFX UI

时间:2014-10-08 02:51:07

标签: javafx

我们知道,我们可以在新线程中运行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进行摆动)?

1 个答案:

答案 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?