【问题标题】:Need some help setting up threading in a javafx app需要一些帮助在 javafx 应用程序中设置线程
【发布时间】:2015-04-14 15:22:15
【问题描述】:

我需要一些帮助来为我的项目选择最佳线程模式。我想听听 Java 专家的意见和他们的意见。

该应用有一个设备列表,存储在一个可观察的列表中。

  1. 应用程序初始化,UI 线程运行
  2. ui 线程调用 unitActiveTask 线程开始监控设备是否处于活动状态,这始终在后台运行。
  3. 用户可以在其他 2 个线程运行时调用某些服务和任务。 任务和服务示例(不太确定服务和任务之间有什么区别)
    • 从列表中删除设备
    • 将文件上传到设备(固件、配置)(可能需要很长时间)
    • 生成配置(生成包含任意值的属性文件,需要 1-5 秒)
    • 很少有其他类似的操作

您可以假设只有 unitActiveTask 不应该阻塞。其他任务可以阻止用户,直到他们完成。唯一应该始终保持响应的就是 ui,unitActiveTask 可能会被暂停。

【问题讨论】:

  • 你能创建一个具体的问题吗?不清楚你到底在问什么。
  • 问题是你将如何处理这个?也许是一些资源的链接。因为有很多变种。任务、可运行对象、线程、执行程序等。然后是相关的数据结构,如阻塞队列、期货、锁。

标签: java multithreading concurrency javafx


【解决方案1】:

这个问题对于这个论坛来说可能太宽泛了;但是,看看这是否足以提供帮助:

Task 表示旨在在后台线程中运行的一次性任务。它可以返回一个值并可以抛出异常。它具有在 FX 应用程序线程上执行的回调方法(因此旨在用于更新 UI),这些方法在其生命周期的各个点被调用,例如 setOnSucceeded(...)setOnFailed(...)。此外,它还有各种update...(...) 方法,用于更新 FX 应用程序线程上的属性。每个Task 实例只能执行一次。

Service 具有与Task 相似的功能,但旨在可重复使用。因此,它具有其他方法,例如reset()restart()。它通过创建和管理Task 实例(通过您需要实现的createTask() 方法)并在一个或多个后台线程上执行它们来工作。

ScheduledService 是一个Service,它可以在指定的时间间隔生成它的Tasks。

对于您的场景:

第 2 项:由于这是在应用程序期间运行的单线程,因此它不适合 Task(旨在执行并返回值)或 Service(实际上只是Tasks 的集合)。为此,您可以考虑使用ScheduledService 定期轮询设备,或者您可以简单地创建一个线程并在后台执行它。在后一种情况下,您应该在线程上调用setDaemon(true),这样它就不会阻止应用程序退出。如果您确实选择了Thread 选项,则由于在线程中执行的代码而需要对 UI 进行的任何更改都需要在 FX 应用程序线程上调用,您可以通过调用 @987654344 来完成@。如果您使用ScheduledService,您可以使用服务或它创建的任务上的回调方法来执行此操作。

第 3 项:Create an Executor 适合您的需求(或多个,如果合适)。在触发相应任务的事件处理程序中,创建一个任务,通过为onSucceededonFailed 设置处理程序来配置它(如果需要),然后在执行程序中执行任务。如果合适,您可以在提交任务之前禁用部分 UI。 onSucceeded 处理程序可以重新启用 UI 的这些部分以及处理任务的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多