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

 微微aviviya 发布于 2022-12-09 13:01

我正在学习Java并试图了解FutureTasks的工作原理.在我的特定情况下,我正在尝试生成一个线程(FutureTask)来执行某些操作.我实际上并不关心它的反应; 我只是希望它以异步方式执行.我用以下测试代码做了很多工作:

public class Main {
    public static void main(String[] args) {
        ExecutorService exService = Executors.newSingleThreadInstance();
        FutureTask asynch = 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()方法已经完成,程序将足够聪明,在那时退出,但显然它保持该线程永远活着?如何让它运行一次然后退出?

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

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

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

    2022-12-11 03:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有