需要一些帮助在javafx应用程序中设置线程

时间:2015-04-14 15:22:15

标签: java multithreading concurrency javafx

我需要一些帮助,为我的项目选择最佳的线程模式。我想听听java专家的意见,他们就是这样做的。

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

  1. 应用程序初始化,UI线程运行
  2. ui线程调用unitActiveTask线程以开始监视设备是否处于活动状态,这始终在后台运行。
  3. 用户可以在其他2个线程运行时调用某些服务和任务。 任务和服务的例子(不确定服务和任务之间的区别)
    • 从列表中删除设备
    • 将文件上传到设备(固件,配置)(可能需要很长时间)
    • 生成配置(生成包含任意值的属性文件,需要1-5秒)
    • 其他一些类似的行动
  4. 您可以假设只有unitActiveTask不应该阻止。其他任务可以阻止用户完成。唯一应该始终保持响应的是ui,unitActiveTask可能会被暂停。

1 个答案:

答案 0 :(得分:0)

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

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

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

ScheduledServiceService,可以按指定的时间间隔生成Task

针对您的情况:

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

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