如何判断一个线程池中的所有线程都执行完成?

本文介绍了一种简单有效的方法来判断Java线程池中的所有线程是否已经完成执行任务,并附带了一个示例代码,展示了如何使用ThreadPoolExecutor的getTaskCount()和getCompletedTaskCount()方法来实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近去参加一个央行项目组的面试,被问到线程池的问题:如何判断一个线程池中的所有线程都已经执行完成?当时没有回答上来。回来之后,google出一堆方案:有用ConcurrentHashmap手动计数的。还有说,先执行线程池的shutdown()方法,此时不再会接受新的线程任务了,只会执行以前的任务,然后通过isTerminated()方法判断时候执行完所有线程。我感觉都不够理想。 经一个比较务实的朋友介绍说api原生支持,我赶紧尝试并记录下来。。顺便吐槽一下,现在的职场,尤其是技术圈的浮躁之风,做了没3年的程序就纷纷想转管理~技术上不求甚解,知其然不知其所以然,迷信于某个人的经验,公司的技术分享也只是迫于升职要求才去做的,分享的内容没干货。。静下心来,做学问,才是对一个程序员最有益处的。言归正传,上代码。

public class ThreadsIsDone {
    public static void main(String[] args) {
        //创建一个10个线程的线程池
        ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 10,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());

        for(int i=0;i<10;i++){
            pool.submit(new Runnable() {
                public void run() {
                    System.out.println("当前线程:"+Thread.currentThread().getName()+",打印随机数:"+ new Random().nextInt(1000));
                }
            });
        }
        System.out.println("pool.getTaskCount():"+pool.getTaskCount());
        System.out.println("pool.getCompletedTaskCount():"+pool.getCompletedTaskCount());
        boolean allThreadsIsDone = pool.getTaskCount()==pool.getCompletedTaskCount();
        System.out.println(allThreadsIsDone);
        if(allThreadsIsDone){
            System.out.println("全部执行完成");
        }
        while (!allThreadsIsDone){
            allThreadsIsDone = pool.getTaskCount()==pool.getCompletedTaskCount();
            if(allThreadsIsDone){
                System.out.println("全部执行完成");
            }
        }


    }
}

输入图片说明

如果有人还有其他方案,欢迎交流

转载于:https://my.oschina.net/nipin/blog/788966

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值