如何使用 Platform.runLater 使 JavaFX 线程安全

Posted

技术标签:

【中文标题】如何使用 Platform.runLater 使 JavaFX 线程安全【英文标题】:How to make JavaFX thread-safe with Platform.runLater 【发布时间】: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();但是,这不会引发任何异常,但不会在窗格上绘制任何内容。我确定任务正在启动。 【参考方案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 工具包中的并发性的一般讨论:

第 1 部分:http://www.guigarage.com/2015/01/concurrency-ui-toolkits-part-1/

第 2 部分:http://www.guigarage.com/2015/02/concurrency-ui-toolkits-part-2/

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何使用 Platform.runLater 使 JavaFX 线程安全的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 2:背景和 Platform.runLater 与任务/服务

Javafx Platform.runLater 永远不会运行

JavaFX UI 在事件侦听器中的 JavaFX 应用程序线程中冻结,但可与 Platform.runLater 一起使用

限制 javafx gui 更新

删除节点时 UI 不更新

当DataInputStream处于while循环时,JavaFX GUI卡住了