我需要使用Service
多次启动Task
(=同一Service
必须运行多个并行Task
)。我阅读了JavaFX文档,他们似乎说Service
一次只能运行一个Task
。
因此,如果我使用start
对象调用两次Service
,则Task
方法返回的第一个createTask
将被停止,就像我使用{{1}一样在第一个restart
之后。
然而,这一点并不清楚。正如我告诉你的那样,文档似乎来告诉你。 确实:
服务创建并管理在后台线程上执行工作的任务。
请注意,我可以认为他们也说start
可以同时启动多个Service
。确实:
可以声明性地构建服务并按需重新启动。
我的问题是:如果我连续使用N Task
,是否会创建N start
并保持每次运行?
答案 0 :(得分:3)
"如果我连续使用N开头,是否会创建N个任务并保持每次运行?
简而言之,没有。
"如果我使用
start
对象拨打Service
两次..."
来自Javadocs:
public void start()
启动此服务。服务必须处于READY状态才能在此呼叫中成功。
因此,如果您在未事先调用reset()
的情况下第二次致电start()
,您将获得例外。如果reset()
未处于Service
或RUNNING
状态,您只能致电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);
}