为什么这个FutureTask导致我的程序永远挂起?

时间:2014-11-28 02:45:23

标签: java

我正在学习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()方法已经完成,程序将足够聪明,在那时退出,但显然它保持该线程永远活着?如何让它运行一次然后退出?

1 个答案:

答案 0 :(得分:5)

执行程序服务正在使用非守护程序线程阻止JVM终止,尝试在完成后关闭服务......

    System.out.println("Started");
    exService.execute(asynch);
    exService.shutdown();
    System.out.println("Good night sweet prince...");

这将导致服务等待所有当前正在运行的任务完成,但不会接受任何新的任务...