我有一个程序,其中我使用由 ExecutorService 控制的多个任务。我实际上使用了 Runnable 并将其更改为任务,但是我似乎做错了,因为我的任务中应该发生的一切都是不开心。我应该提一下,程序没有完成,它无限运行。有人能告诉我我错过了什么吗?
public class Test{
ExecutorService exec;
public Test (){
exec = Executors.newCachedThreadPool();
run();
}
public static void main(String[] args) {
Test test = new Test();
}
private void run() {
System.out.println("This works normal");
Task<Void> task = new Task<Void>() {
@Override
protected Void call(){
System.out.println("Here nothing happens already");
for (int i = 0; i < 10; i++)
exec.submit(() -> { System.out.println("Offcourse no sub-task works either"); });
return null;
}
};
exec.submit(task);
}
}
这些是我的进口商品:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javafx.concurrent.Task;
我用:
- Netbeans IDE 8.2
- 爪哇 - Windows 10 Pro
答案 0 :(得分:1)
作为一项不寻常的功能,Task
(它是javafx包的一部分)实现了Callable
和Runnable
。当您将任务提交到ExecutorService
时,它会调用Task.run
方法,该方法在Task
中有一个空的,已删除的实现。如果您在匿名类中重写run
,那么您将看到代码运行。
您是否考虑过直接从Callable
创建匿名类?或者您是否故意使用Task
类,因为您正在使用JavaFX?
如果您正在使用JavaFX并且故意使用Task
,那么Task
API会建议以下内容:
虽然ExecutorService定义了几个采用a的方法 Runnable,你通常应该限制自己使用execute 从Executor继承的方法。
call
方法通常适用于使用Service
要关闭ExecutorService
,您应该调用exec.shutdown()
。