我正在学习Java并试图了解FutureTasks的工作原理.在我的特定情况下,我正在尝试生成一个线程(FutureTask)来执行某些操作.我实际上并不关心它的反应; 我只是希望它以异步方式执行.我用以下测试代码做了很多工作:
public class Main { public static void main(String[] args) { ExecutorService exService = Executors.newSingleThreadInstance(); FutureTaskasynch = new FutureTask<>(new Callable () { @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()方法已经完成,程序将足够聪明,在那时退出,但显然它保持该线程永远活着?如何让它运行一次然后退出?
执行程序服务正在使用非守护程序线程阻止JVM终止,尝试在完成后关闭服务...
System.out.println("Started"); exService.execute(asynch); exService.shutdown(); System.out.println("Good night sweet prince...");
这将导致服务等待所有当前正在运行的任务完成,但不会接受任何新的任务添加...