【问题标题】:How to make JavaFX thread-safe with Platform.runLater如何使用 Platform.runLater 使 JavaFX 线程安全
【发布时间】:2014-12-17 14:50:51
【问题描述】:

我正在制作一个 JavaFX 应用程序,在该应用程序中读取问题并在按下开始按钮时生成解决方案。问题是当我单击开始按钮时,GUI 挂起。我查看了this post,它建议将线程安全方法包装在 Platform.Runlater 中。

现在,当单击按钮时,将调用我的控制器中的方法 doBtnStartPressed()。此方法仅包含对 showSolution() 方法的调用。然后我把这个方法的内容封装在Platform.runLater中如下:

private void showSolution() {
    Platform.runLater(new Runnable() {
        public void run() {
           // solve problem
           // draw solution on panes (rectangles which represent time windows)
        }
    });
}

但这不起作用。

【问题讨论】:

  • 您引用的帖子(正确)说“使用PlatForm.RunLater 进行快速简单的操作,使用Task 进行复杂和大型操作”。您将需要并发框架(Task 甚至更多)。有关介绍,请参阅here
  • 谢谢,我还尝试将 showSolution() 方法的内容包装在 Task 中,然后调用 new Thread(task).start();但是,这不会引发任何异常,但不会在窗格上绘制任何内容。我确定任务正在启动。

标签: java multithreading concurrency javafx


【解决方案1】:

您可以在此处找到 JavaFX 中后台任务的一般概述以及如何处理它们:http://www.guigarage.com/2014/10/datafx-8-released/(滚动到标题“ProgressChain”)。

此外,我在今年 JavaOne 的“JavaFX Enterprise”演讲中也提到了这个话题。你可以在这里找到幻灯片:http://de.slideshare.net/HendrikEbbers/javafx-enterprise-javaone-2014?related=1

可以在此处找到有关 JavaFX 和 UI 工具包中的并发性的一般讨论:

【讨论】:

    【解决方案2】:

    您需要在 runLater 之外解决长时间运行的操作,并且 在那里构造 SceneGraph 元素(实际上并不将它们附加到父级),然后只需调用一次就将它们添加到您的真实场景中runLater 调用。

    【讨论】:

      猜你喜欢
      • 2018-05-24
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2011-01-27
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多