【问题标题】:Task vs Service for database operations用于数据库操作的任务与服务
【发布时间】:2013-09-23 16:45:28
【问题描述】:

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

【问题讨论】:

    标签: javafx-2 javafx javafx-8


    【解决方案1】:

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

    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 很好地概述了任务和服务。

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

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

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

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

    任务定义:

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

    服务定义:

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

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

    【讨论】:

    • 我认为定义令人困惑的地方在于,服务文档谈到“减轻应用程序开发人员管理与用户界面交互的多线程代码的负担”,但任务并没有不要直接谈论它。几乎让您看起来需要使用服务而不是任务来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2013-05-10
    相关资源
    最近更新 更多