我正在学习Java并试图了解FutureTasks的工作原理。在我的特定情况下,我正在尝试生成一个线程(FutureTask)来执行某些操作。我实际上并不关心它的反应;我只是希望它以异步方式执行。我已经完成了以下测试代码:
public class Main {
public static void main(String[] args) {
ExecutorService exService = Executors.newSingleThreadInstance();
FutureTask<Boolean> asynch = new FutureTask<>(new Callable<Boolean>() {
@Override
public Boolean call() {
try {
// wait for 5 seconds to simulate activity
Thread.sleep(5000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
System.out.println("Complete");
return true;
}
});
System.out.println("Started");
exService.execute(asynch);
}
}
当我运行此代码时,它会将“已启动”打印到控制台,然后五秒后打印出“完成”,就像我期望的那样。但是......程序在这一点上无限期地挂起。我假设,因为call()方法已经完成,程序将足够聪明,在那时退出,但显然它保持该线程永远活着?如何让它运行一次然后退出?
答案 0 :(得分:5)
执行程序服务正在使用非守护程序线程阻止JVM终止,尝试在完成后关闭服务......
System.out.println("Started");
exService.execute(asynch);
exService.shutdown();
System.out.println("Good night sweet prince...");
这将导致服务等待所有当前正在运行的任务完成,但不会接受任何新的任务...