32

JavaFX 8 Task 和 Service 之间有什么区别,在哪种情况下使用一个比另一个更好?在数据库操作中使用什么更好?

4

1 回答 1

63

任务和服务之间的主要区别 - 一次与重复执行

任务是一次性的- 您只能使用一次任务。如果要再次执行相同的 Task,则需要构造一个新的 Task 实例。

Service有一个可重用的接口,因此您可以多次启动和重新启动单个服务实例。在幕后,它只需要一个任务定义作为输入,并根据需要创建新任务。

示例用例

任务示例=> 在应用程序初始化时监控和报告长时间运行的启动任务的进度,例如这个Splash Page 示例

服务示例=> WebEngine 的内部加载工作者实现,其中异步加载页面的相同任务需要为加载的每个页面重复。

建议 - 最初尝试仅使用任务而不是服务来解决您的问题

在您更熟悉 JavaFX 中的并发之前,我建议您坚持只使用任务而不是服务。任务有一个稍微简单的界面。您可以通过在需要时创建新的任务实例来完成服务的大部分工作。如果在了解 Task 之后,您发现自己想要一个预定义的 API 来启动或重新启动 Tasks,那么此时就开始使用 Service。

使用任务的数据库访问示例

Task 或 Service 都可以在 JavaFX 应用程序线程之外执行数据库操作。使用哪个取决于您的个人编码偏好以及正在执行的特定数据库操作。

这是一个使用Task 通过 JDBC 访问数据库的示例。该示例是为JavaFX-Background Thread for SQL Query创建的。

背景资料

JavaFX 并发教程很好地概述了任务和服务。

Task and Service javadoc中有出色的文档,包括示例用例的示例代码。

Worker、Task 和 Service 定义(来自 Javadoc)

Task 和 Service 都是Workers,所以它们有一个共同点:

Worker 是一个对象,它在一个或多个后台线程中执行某些工作,其状态是可观察的,可供 JavaFX 应用程序使用,并且可从 JavaFX 应用程序主线程使用。

任务定义:

FutureTask的完全可观察的实现。任务公开了额外的状态和可观察属性,这些属性对于在 JavaFX 中编写异步任务很有用。. 因为服务旨在执行任务,所以应用程序或库代码定义的任何任务都可以轻松地与服务一起使用。

服务定义:

服务是一种非可视组件,它封装了在一个或多个后台线程上执行某些工作所需的信息。作为 JavaFX UI 库的一部分,该服务了解 JavaFX 应用程序线程,旨在减轻应用程序开发人员管理与用户界面交互的多线程代码的负担。因此,服务上的所有方法和状态都旨在专门从 JavaFX 应用程序线程调用。

Service 实现了 Worker。因此,您可以观察后台操作的状态并选择取消它。Service 是一个可重用的 Worker,这意味着它可以被重置和重新启动。因此,可以声明式地构建服务并按需重新启动。

于 2013-09-18T20:39:00.893 回答