【问题标题】:How to run two JavaFX UI in actual different threads如何在实际不同的线程中运行两个 JavaFX UI
【发布时间】:2014-10-08 02:51:07
【问题描述】:

我们知道,我们可以在支持 javaFX 应用程序线程的新线程中运行 javafx UI 更新。

  new Thread(new Runnable() {
            @Override
            public void run() {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                       //UI Stuff
                    }
                });
            }
        }).start();

当我们开始两次 UI 更新时,让我们考虑在两个不同的线程中进行两个阶段处理。

新线程(...... 更新UI(stage1)

新线程(...... 更新UI(stage2)

updateUI 方法是这样的。

void updateUI(Stage stage) {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                //UI Stuff
            }
        });
    }

问题是这两个阶段永远不会同时更新。我认为他们都在 Platform.runLater 中使用相同的 javafx 应用程序线程。

我想同时更新这两个阶段。我该怎么做(我们知道可以在 AWT 和 swing 中运行多个 UI 线程,JavaFX 有机会)?

【问题讨论】:

    标签: javafx


    【解决方案1】:

    您无法控制 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 时,“问题是两个阶段永远不会同时更新” - 这正是 Platform.runLater 的文档所说的“在 JavaFX 应用程序线程上运行指定的 Runnable”未来某个未指定的时间” - 因此当您使用 Platform.runLater 时没有排序保证。

    我想同时更新这两个阶段

    与其创建您自己的线程,不如在 JavaFX 应用程序线程上按顺序执行的代码中更新两个阶段的场景图(例如,在您的应用程序的启动方法或事件处理程序中)。一旦您的应用程序在 JavaFX 应用程序线程上执行指令,所有应用程序指令将在呈现修改后的场景图的 JavaFX 线程的下一个“脉冲”之前执行 - 因此从用户的角度来看,这两个阶段将同时更新为脉冲呈现它们。默认情况下,JavaFX 将每秒发出 60 次渲染脉冲。如果您在 JavaFX 应用程序线程上做了很多工作,那么在下一个脉冲发生之前会有一个暂停(这就是为什么建议您在不到六十分之一秒内完成所有工作的原因)。

    如果您必须做大量工作(例如,一些 I/O 或极其昂贵的计算任务,需要四分之一秒或更长时间),您将需要使用前面提到的 JavaFX 并发工具来确保您不会冻结您的 UI,然后仅在所有并发任务完成后才更新 UI - 回答中展示了各种技术:How to reset progress indicator between tasks in JavaFX2?

    【讨论】:

    • 嗨。感谢您的答复。我已经尝试过使用并发任务。 (工人)但它也没有做好。我还阅读了有关绑定方法的内容,但问题是在这种情况下很难。应用程序在启动时使用数据库更新了几个 TableView。一个数据库表直接连接到从标签扩展的对象。所以我的解决方案是绑定table-view的valueproperty,绑定Label的valueproperty。
    • 小心这种方法,确保只将 UI 元素绑定到在 JavaFX 应用程序线程上修改的属性。
    • 那么您对我的情况有何建议?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2018-06-02
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多