JavaFX的Platform.runLater和访问的使用,从不同的线程UI(Usage of J

2019-07-20 19:13发布

我有几个问题Platform.runLater 。 我有一个JavaFX应用程序类。 在这一类我运行一个线程(线程从网络套接字读取数据)。

现在,当我创建一个新的Stage的线程内,系统将引发execption(JavaFX的事件调度线程和我netork读线程是不一样的) -我理解这种行为。

但是,另一边则是,我从网络阅读器的文本追加到现有的TextArea或添加/删除在一些项目ListView<String> -这并不抛出异常-为什么? 我认为JavaFX是单线程(该UI库部分)。 这是同样的事情,在Swing:有时工作,有时你刚刚垃圾(因为EDT)?

我的问题:

  • 什么时候JavaFX的事件调度线程抛出一个异常,何时不?
  • 是关于这个任何好的文件
  • 是否有更简单(短和清洁剂)的方式来使用Platform.runLaterrun()方法? 在一个尝试捕捉(或多个catch)的组合,它看起来很奇怪

我知道的使用Platform.runLater在一个线程是不是很好(设计方案)。

Answer 1:

“这并不抛出异常 - 为什么?” 因为并不是所有的这种情况下,毫无遗漏都可能......因为性能方面的考虑,可能的话,它仅仅是一个错过的功能。

使用JavaFX对象(包括创建)交互必须在JFX线程来完成,如果你想从另一个线程访问这些对象JFX - 使用runLater或runAndWait方法。 如果现在不抛出异常,它可能会开始扔在将来的例外。 与JFX对象进行的互动可能会导致后续的行动和活动,将通过一些线程检查器毫无遗漏地 - 你不能确定。

我不认为,对这个有什么好的文档 - 只是一个简单的规则 - 使用runLater或runAndWait。

更短的和更清洁的方式 - 将在JDK 8使用lambda来提供。



Answer 2:

亚历山大的回答捕捉关于您的问题最重要的要点。

这个答案提供了一些补充信息。

什么时候JavaFX的事件调度线程抛出一个异常,何时不?

JavaFX的系统并不总是检查访问影响活动场景图对象被适当限制到JavaFX的线程。 最终,确保这些线程安全是JavaFX应用程序编程人员的责任 - 而不是JavaFX的系统。 JavaFX中执行多线程编程时,你必须非常小心,否则应用程序的行为可能会失败或变得不可预测。

是关于这个任何好的文件

尝试了JavaFX教程: 并发JavaFX中 。

是否有更简单(短和清洁剂)的方式来使用Platform.runLater用run()方法?

Platform.runLater是因为它得到简单。


作为旁白 。 。 。

任务和服务

考虑使用任务或服务的子类工人 。 这些是JavaFX的包装器FutureTask (其又一个可运行 )。 工人提供一个呼叫的方法来在后台线程运行的逻辑。 他们坚持执行状态 (与线程安全的回调通知的JavaFX线程状态更改),并通过回电话的结果值 , 消息和例外性。

您可以在设计模式的优势, TaskService的javadoc实例以简化的功能,如线程安全的应用程序的创建:

  • 对于UI更新数据的异步提取。
  • 任务进展情况的消息更新。
  • 建设中尚未连接到显示的场景节点图。
  • 通过进度条等监测进展情况

Worker是互补Platform.runLater 。 使用Platform.runLater当你执行关闭了JavaFX应用程序线程,并且要运行的JavaFX应用程序线程一些逻辑。 使用Worker ,当你在JavaFX应用程序线程运行,并希望产卵一些逻辑或(尤其是)I / O上一个新的线程,这样你就不会阻塞了JavaFX应用程序线程。 你绝不会希望做一个内部网络I / O Platform.runLaterrun方法,但常常会想这样做在一个Workercall方法。

而且,使用TaskService是不使用不兼容的Platform.runLater 。 举例来说,如果你有一个很长的运行Task从要定期回访部分结果到UI或作为缓冲区填满,然后执行Platform.runLater在任务的call方法是做到这一点的方式。

工人是有用的,当你没有一个图书馆提供的现有螺纹服务,而是将创建自己的线程在后台执行。 如果你有一个现有的螺纹的服务,那么你就需要使用Platform.runLater到JavaFX应用程序线程上执行逻辑。

需要注意的是,你还需要知道你在做什么,即使你使用一个Worker 。 你还必须小心不要违反标准的JavaFX并发规则,如在活动场景图从未更新节点(包括不更新该节点在活动场景图也必然价值观-如可观察名单的项目支持一个ListView控件 )。



文章来源: Usage of JavaFX Platform.runLater and access to UI from a different thread