亚历山大的回答抓住了关于您的问题的最重要的一点。
这个答案提供了一些补充信息。
JavaFX 事件调度程序线程何时抛出异常,何时不抛出异常?
JavaFX 系统并不总是检查对影响活动场景图的对象的访问是否正确地限制在 JavaFX 线程中。最终,确保这种线程安全是 JavaFX 应用程序程序员的责任,而不是 JavaFX 系统。在 JavaFX 中执行多线程编程时必须非常小心,否则应用程序行为可能会失败或变得不可预测。
关于这个有什么好的文件吗
试试 JavaFX 教程:JavaFX 中的并发。
有没有一种更简单(更短、更简洁)的方法来使用 Platform.runLater 和 run() 方法?
不Platform.runLater
,就是这么简单。
作为旁白 。. .
任务与服务
考虑使用Worker的Task或Service子类。这些是FutureTask的 JavaFX 包装器(又是Runnable)。Worker 提供了一个调用方法来在后台线程上运行逻辑。它们维护执行状态(通过向 JavaFX 线程发出线程安全回调通知以进行状态更改)并通过value、message和exception属性返回调用结果。
Task
利用和javadoc 示例中的设计模式Service
来简化线程安全应用程序的创建,这些应用程序具有以下特性:
- 为 UI 更新异步获取数据。
- 任务进度的定期消息更新。
- 构建尚未附加到显示场景的节点图。
- 通过进度条等监控进度。
AWorker
与 互补Platform.runLater
。Platform.runLater
当您在 JavaFX 应用程序线程之外执行并且想要在 JavaFX 应用程序线程上运行一些逻辑时使用。当Worker
您在 JavaFX 应用程序线程上运行并希望在新线程上产生一些逻辑或(尤其是)I/O 时使用 a,这样您就不会阻塞 JavaFX 应用程序线程。您永远不会想在 a 的方法中进行网络 I/O Platform.runLater
,run
但通常希望在 aWorker
的call
方法中进行。
此外,Task
andService
的使用与Platform.runLater
. 例如,如果您有一个很长的运行Task
时间,您希望定期或在缓冲区填充时将部分结果返回到 UI,那么Platform.runLater
在任务的call
方法中执行就是执行此操作的方法。
当您没有库提供的现有线程服务,而是创建自己的线程以在后台执行时,工作者很有用。如果您有一个现有的线程服务,那么您将需要使用Platform.runLater
在 JavaFX 应用程序线程上执行逻辑。
请注意,即使您使用Worker
. 您仍然必须注意不要违反标准 JavaFX 并发规则,例如从不更新活动场景图中的节点(包括不更新活动场景图中的节点绑定到的值 - 例如支持的可观察项目列表一个列表视图)。