如何使用 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 一起使用