任务和服务之间的主要区别 - 一次性执行与重复执行
A Task http://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html是一次性的事情 - 你只能使用一个任务一次。如果想再次执行同一个Task,则需要构造一个新的Task实例。
A Service http://docs.oracle.com/javafx/2/api/javafx/concurrent/Service.html具有可重用的接口,以便您可以多次启动和重新启动单个服务实例。在幕后,它仅将任务定义作为输入并根据需要创建新任务。
示例用例
任务示例=> 监视和报告应用程序初始化时长时间运行的启动任务的进度,如下所示启动页面示例 https://gist.github.com/jewelsea/2305098.
服务示例=> 的WebEngine 的内部负载工作器实现 http://docs.oracle.com/javafx/2/api/javafx/scene/web/WebEngine.html#getLoadWorker%28%29对于加载的每个页面,都需要重复异步加载页面的相同任务。
建议 - 最初尝试仅使用任务而不是服务来解决您的问题
在您更加熟悉 JavaFX 中的并发性之前,我建议坚持仅使用任务而不是服务。任务的界面稍微简单一些。您只需在需要时创建新的任务实例即可完成服务的大部分功能。如果在了解 Task 后,您发现自己需要一个预定义的 API 来启动或重新启动 Task,那么此时就开始使用 Service。
使用任务的数据库访问示例
任务或服务都将用于在 JavaFX 应用程序线程之外执行数据库操作。使用哪个取决于您的个人编码偏好以及正在执行的特定数据库操作。
这是一个使用通过 JDBC 访问数据库的任务 https://gist.github.com/jewelsea/4957967。该示例是为JavaFX - SQL 查询的后台线程 https://stackoverflow.com/questions/14878788/javafx-background-thread-for-sql-query.
背景资料
The JavaFX 并发教程 http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm提供了任务和服务的良好概述。
有很好的文档Task http://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html and Service http://docs.oracle.com/javafx/2/api/javafx/concurrent/Service.htmljavadoc,包括示例用例的示例代码。
Worker、Task 和 Service 定义(来自 Javadoc)
任务和服务都是Workers http://docs.oracle.com/javafx/2/api/javafx/concurrent/Worker.html,所以它们有一个共同点:
Worker 是一种在一个或多个后台线程中执行某些工作的对象,其状态可观察且可供 JavaFX 应用程序使用,并且可从主 JavaFX 应用程序线程使用。
任务定义:
一个完全可观察的实现未来任务 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html。任务公开额外的状态和可观察属性,对于在 JavaFX 中编程异步任务很有用。 。因为 Service 被设计为执行任务,所以任何任务
由应用程序或库代码定义的可以轻松地与
服务。
服务定义:
服务是封装信息的非可视组件
需要在一个或多个后台线程上执行某些工作。作为
作为 JavaFX UI 库的一部分,服务了解 JavaFX
并且是为了减轻应用程序线程的负担而设计的
开发人员摆脱了管理交互的多线程代码的负担
与用户界面。因此,所有方法和状态
服务旨在专门从 JavaFX 调用
应用程序线程。
Service 实现了 Worker。因此,您可以观察
后台操作并可选择取消它。服务是可重复使用的
Worker,意思是可以重置、重启。由于这个原因,一个
服务可以以声明方式构建并按需重新启动。