【发布时间】:2013-09-23 16:45:28
【问题描述】:
JavaFX 8 Task 和 Service 之间有什么区别,在哪种情况下使用一个比另一个更好?数据库操作用什么比较好?
【问题讨论】:
JavaFX 8 Task 和 Service 之间有什么区别,在哪种情况下使用一个比另一个更好?数据库操作用什么比较好?
【问题讨论】:
任务和服务之间的主要区别 - 一次与重复执行
Task 是一次性的 - 您只能使用一次任务。如果你想再次执行相同的Task,你需要构造一个新的Task实例。
Service 具有可重用的接口,因此您可以多次启动和重新启动单个服务实例。在幕后,它只需要一个任务定义作为输入,并根据需要创建新任务。
示例用例
任务示例 => 在应用程序初始化时监控和报告长时间运行的启动任务的进度,例如 Splash Page example。
服务示例 => internal load worker implementation for WebEngine,其中异步加载页面的相同任务需要为每个加载的页面重复。
建议 - 最初尝试仅使用任务而不是服务来解决您的问题
在您更熟悉 JavaFX 中的并发之前,我建议您坚持只使用任务而不是服务。任务有一个稍微简单的界面。您可以通过在需要时创建新的任务实例来完成服务的大部分工作。如果在了解了 Task 之后,您发现自己想要一个预定义的 API 来启动或重新启动 Tasks,那么此时就开始使用 Service。
使用任务的数据库访问示例
Task 或 Service 都可以在 JavaFX 应用程序线程之外执行数据库操作。使用哪个取决于您的个人编码偏好以及正在执行的特定数据库操作。
这是一个使用Task to access a database via JDBC 的示例。该示例是为JavaFX - Background Thread for SQL Query 创建的。
背景信息
JavaFX concurrency tutorial 很好地概述了任务和服务。
Task 和 Service javadoc 中有出色的文档,包括示例用例的示例代码。
Worker、Task 和 Service 定义(来自 Javadoc)
Task 和 Service 都是Workers,所以它们有一个共同点:
Worker 是在一个或多个后台线程中执行某些工作的对象,其状态是可观察的,可供 JavaFX 应用程序使用,并且可从 JavaFX 应用程序主线程使用。
任务定义:
FutureTask 的完全可观察的实现。任务公开了额外的状态和可观察属性,这些属性对于在 JavaFX 中编写异步任务很有用。 .由于 Service 旨在执行任务,因此任何任务 由应用程序或库代码定义可以很容易地与 服务。
服务定义:
服务是封装信息的非可视组件 需要在一个或多个后台线程上执行一些工作。作为 JavaFX UI 库的一部分,服务了解 JavaFX 应用程序线程,旨在减轻应用程序 开发人员从管理交互的多线程代码的负担中解脱出来 与用户界面。因此,所有的方法和状态 服务旨在仅从 JavaFX 调用 应用线程。
Service 实现了 Worker。因此,您可以观察到的状态 后台操作并可选择取消它。服务是可重用的 Worker,意味着它可以被重置和重新启动。正因为如此,一个 服务可以声明式构建并按需重启。
【讨论】: