我需要一些帮助,为我的项目选择最佳的线程模式。我想听听java专家的意见,他们就是这样做的。
该应用有一个设备列表,存储在一个可观察列表中。
您可以假设只有unitActiveTask不应该阻止。其他任务可以阻止用户完成。唯一应该始终保持响应的是ui,unitActiveTask可能会被暂停。
答案 0 :(得分:0)
这个问题对于这个论坛来说可能过于宽泛;但是,看看这是否足以帮助:
Task
表示旨在在后台线程中运行的一次性任务。它可以返回一个值并可以抛出异常。它具有在FX应用程序线程上执行的回调方法(因此旨在用于更新UI),这些方法在其生命周期的各个点调用,例如setOnSucceeded(...)
和setOnFailed(...)
。此外,它还有各种update...(...)
方法,用于更新FX应用程序线程的属性。每个Task
实例只能执行一次。
Service
具有与Task
类似的功能,但可以重复使用。因此,它还有其他方法,例如reset()
和restart()
。它的工作原理是创建和管理Task
实例(通过createTask()
方法,您需要实现)并在一个或多个后台线程上执行它们。
ScheduledService
是Service
,可以按指定的时间间隔生成Task
。
针对您的情况:
第2项:由于这是在应用程序持续时间内运行的单个线程,因此它不适合Task
(用于执行和返回值)或Service
(这实际上只是Task
s的集合。为此,您可以考虑使用ScheduledService
定期轮询设备,或者您可以创建一个线程并在后台执行它。在后一种情况下,您应该在线程上调用setDaemon(true)
,以便它不会阻止应用程序退出。如果您确实选择Thread
选项,则需要在FX应用程序线程上调用由于在线程中执行的代码而需要对UI进行的任何更改,您可以通过调用Platform.runLater(...)
。如果您使用ScheduledService
,则可以使用服务上的回调方法或其创建的任务来执行此操作。
第3项:Create an Executor
适合您的需要(如果合适,可以多于一个)。在触发相应任务的事件处理程序中,创建任务,通过设置onSucceeded
和onFailed
(如果需要)的处理程序来配置它,并在执行程序中执行任务。如果合适,您可以在提交任务之前禁用部分UI。 onSucceeded
处理程序可以重新启用UI的这些部分以及处理任务的结果。