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