服务可以启动多个任务吗?

时间:2016-10-04 18:52:41

标签: javafx multitasking

我需要使用Service多次启动Task(=同一Service必须运行多个并行Task)。我阅读了JavaFX文档,他们似乎说Service一次只能运行一个Task

因此,如果我使用start对象调用两次Service,则Task方法返回的第一个createTask将被停止,就像我使用{{1}一样在第一个restart之后。

然而,这一点并不清楚。正如我告诉你的那样,文档似乎来告诉你。 确实:

  

服务创建并管理在后台线程上执行工作的任务。

请注意,我可以认为他们也说start可以同时启动多个Service。确实:

  

可以声明性地构建服务并按需重新启动。

我的问题是:如果我连续使用N Task,是否会创建N start并保持每次运行?

1 个答案:

答案 0 :(得分:3)

  

"如果我连续使用N开头,是否会创建N个任务并保持每次运行?

简而言之,没有。

  

"如果我使用start对象拨打Service两次..."

来自Javadocs

  

public void start()

     

启动此服务。服务必须处于READY状态才能在此呼叫中成功。

因此,如果您在未事先调用reset()的情况下第二次致电start(),您将获得例外。如果reset()未处于ServiceRUNNING状态,您只能致电SCHEDULED。您可以调用restart(),这将影响首先取消当前任务,然后重新启动该服务。 (这就是文档中所说的"服务可以按需重新启动&#34 ;.)

这样做的最终结果是服务不能同时拥有两个当前正在运行的任务,因为没有抛出IllegalStateException就没有可以达到这种情况的调用序列。

如果您希望一次运行多个任务,只需自己创建它们并将它们提交给执行程序(或者在自己的线程中运行每个任务,但首选执行程序):

private final Executor exec = Executors.newCachedThreadPool(runnable -> {
    Thread t = new Thread(runnable);
    t.setDaemon(true);
    return t ;
});

// ...

private void launchTask() {

    Task<MyDataType> task = new Task<MyDataType>(){
        @Override
        protected Something call() {
            // do work...
            return new MyDataType(...);
        }
    };
    task.setOnSucceeded(e -> { /* update UI ... */ });
    task.setOnFailed(e -> { /* handle error ... */ });
    exec.execute(task);

}