当前位置: 首页 > 知识库问答 >
问题:

JavaFX平台的使用。runLater和从其他线程访问UI

仰雅昶
2023-03-14

我对平台有几个问题。稍后运行。我有一个JavaFX应用程序类。在这个类中,我运行一个线程(线程从网络套接字读取数据)。

现在,当我在线程中创建一个新的Stage时,系统会抛出一个执行(JavaFX事件调度器线程和我的netork-read线程不一样)-我理解这种行为。

但另一方面,我将来自网络阅读器的文本附加到现有的文本区域,或者在列表视图中添加/删除一些项目

我的问题:

  • JavaFX事件调度器线程何时引发异常,何时不引发异常

我知道Platform.run稍后在线程中的用法不是很好(设计解决方案)

共有2个答案

锺高翰
2023-03-14

“这不会引发异常-为什么?”因为不是所有的病例都是咳嗽。。。可能是因为性能方面的考虑,可能只是缺少了功能。

与JavaFX对象的所有交互(包括创建)都必须在JFX线程上完成,如果您想从其他线程访问这些JFX对象,请使用runLater或runAndWait方法。如果现在不抛出异常,将来可能会开始抛出异常。与JFX对象的任何交互都可能导致后续的操作和事件,这些操作和事件将被某些线程检查器忽略——您无法确定。

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

更短更干净的方式-将在JDK 8中使用Lambda提供。

梁丘飞鸾
2023-03-14

亚历山大的回答抓住了你问题中最重要的一点。

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

JavaFX事件调度程序线程何时抛出异常,何时不抛出异常?

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

关于这件事有什么好的文件吗

尝试JavaFX教程:JavaFX中的并发性。

有没有更容易的(更短的

不。Platform.run稍后就这么简单。

作为旁白。

任务和服务

考虑使用Worker的任务或服务子类。这些是FutureTask的JavaFX包装器(反过来又是Runnable)。工人提供了一种调用方法来在后台线程上运行逻辑。他们维护执行状态(通过线程安全回调通知JavaFX线程以进行状态更改)并通过值、消息和异常属性返回调用结果。

利用javadoc示例中的任务和服务中的设计模式,简化线程安全应用程序的创建,其功能如下:

  • 为UI更新异步获取数据。
  • 任务进度的定期消息更新。
  • 构造尚未附加到显示场景的节点图。
  • 通过进度条等监控进度

工作人员是平台的补充。稍后运行。使用平台。稍后运行当您在JavaFX应用程序线程之外执行并且希望在JavaFX应用程序线程上运行一些逻辑时。当您在JavaFX应用程序线程上运行时,需要在新线程上生成一些逻辑或(尤其是)I/O,这样您就不会阻塞JavaFX应用程序线程。您永远不会希望在平台内进行网络I/O。runLater的run方法,但通常希望在Worker的call方法中执行。

此外,任务服务的使用与Platform.run稍后的使用并不矛盾。例如,如果您有一个运行时间很长的任务,您想定期或在缓冲区填充时将部分结果返回到UI,那么在任务的调用方法中执行Platform.run稍后就是这样做的方法。

当您没有库提供的现有线程服务,而是创建自己的线程以在后台执行时,辅助角色很有用。如果您有现有的线程服务,那么您将需要使用Platform.run稍后在JavaFX应用程序线程上执行逻辑。

请注意,您仍然需要知道自己在做什么,即使您使用的是工作人员。您仍然必须注意不要违反标准的JavaFX并发规则,例如从不更新活动场景图上的节点(包括不更新活动场景图中节点绑定到的值,例如支持ListView的可观察项目列表)。

 类似资料:
  • 问题内容: 我正在开发一个android应用程序,并且有一个按钮可以启动/暂停某些模拟过程。在此过程运行时,我需要实时输出一些数据。但是,当我为仿真创建新线程时,无法从该线程访问视图(将其命名为TextView),因为只能从创建它们的线程访问它们。另一方面,新线程是必需的,因为否则在仿真运行时,用户将无法执行任何操作(例如,按下其他一些按钮)。在这种情况下,创建新服务还需要创建一个新线程。我应该如

  • 我对JavaFX中/的概念感到非常困惑。 我在后台工作中使用了一个基于后台线程的模型,该模型调用平台。稍后运行以更新UI。 假设我对进度条之类的东西不感兴趣。我正在对我的模型做一些实际的工作,这些工作必须在GUI的视图中更新(例如,根据后台的某些连接随着时间的推移而更新的参与者列表,基于某些用户输入的参与者列表,按年龄和来源分类)。这是我通常通过启动后台线程来实现的,在其中我使用。 现在在Java

  • SDK        LSV的SDK开发包对外开放,如果您和您的团队需要进行开发需使用LSV的SDK开发包,您可以进行申请,我们的工作人员会在两个工作日内与您联系以确定进一步事项。同时,我们也提供LSV安卓端的Java开发包,如有需要也可进行申请。 点击链接了解详情 移动端        LSV的移动端支持Android以及AndroidPad两个平台,用户可以同过不同的需求进行下载。LSV手机端

  • SDK        LSV的SDK开发包对外开放,如果您和您的团队需要进行开发需使用LSV的SDK开发包,您可以进行申请,我们的工作人员会在两个工作日内与您联系以确定进一步事项。同时,我们也提供LSV安卓端的Java开发包,如有需要也可进行申请。 点击链接了解详情 移动端        LSV的移动端支持Android以及AndroidPad两个平台,用户可以同过不同的需求进行下载。LSV手机端

  • 问题内容: 我的班级有一个名为DataStorage的哈希图: 如何在另一个类中访问此HashMap中的数据? 问题答案: 将HashMap创建为实例变量,并提供一种将其访问类API的方法:

  • 其它平台接入 1.支付宝小程序 兑吧的积分商城为HTML5页面,需要通过小程序的< web-view />组件来加载。 组件使用条件 1.基础库 1.6.0 开始支持,低版本需做兼容 2.每个页面只能有一个,请不要渲染多个,webview会自动铺满整个页面,并覆盖其它组件。(具体请参考 小程序官方组件文档 )。 添加业务域名 web-view加载H5页面需要添加业务域名白名单 1.需要添加的业务域