5种方法,教你判断线程池是否全部完成

 我来答
舒适还明净的海鸥i
2022-08-01 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:67.4万
展开全部
最近写小玩具的时候用到了 CountDownLatch 计数器,然后顺便想了想判断线程池全部结束有多少种方法。

在网上搜了下,可能有些没找到,但是我找到的有(所有方法都是在 ThreadPoolExecutor 线程池方法下测试的):

好嘞,现在开始一个一个介绍优缺点和简要原理;

先创建一个 static 线程池,后面好几个例子就不一一创建了,全部用这个就行了:

然后再准备一个通用的睡眠方法:

这个方法就是为了测试的时候区分线程执行完毕的下顺序而已。

好嘞,准备完毕,现在开始。

首先贴上测试代码:

这一种方式就是在主线程中进行循环判断,全部任务是否已经完成。

这里有两个主要方法:

通俗点讲,就是在执行全部任务后,对线程池进行 shutdown() 有序关闭,然后循环判断 isTerminated() ,线程池是否全部完成。

类似方法扩展:

还是一样,贴上代码:

还是一样在主线程循环判断,主要就两个方法:

这个好理解,总任务数等于已完成任务数,就表示全部执行完毕。

其他 :

最后扯两句,因为我用 main 方法运行的,跑完后 main 没有结束,是因为非守护线程如果不终止,程序是不会结束的。而线程池 Worker 线程里写了一个死循环,而且被设置成了非守护线程。

这种方法是我比较常用的方法,先看代码:

这种方法,呃,应该是看起来比较高级的,我也不知道别的大佬怎么写的,反正我就用这个。

这个方法需要介绍下这个工具类 CountDownLatch 。先把这种方式的优缺点写了,后面再详细介绍这个类。

CountDownLatch 是 JDK 提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作。

常用的方法有 countDown 方法和 await 方法, CountDownLatch 在初始化时,需要指定用给定一个整数作为计数器。

当调用 countDown 方法时,计数器会被减1;当调用 await 方法时,如果计数器大于0时,线程会被阻塞,一直到计数器被 countDown 方法减到0时,线程才会继续执行。

计数器是无法重置的,当计数器被减到0时,调用 await 方法都会直接返回。

这种方式其实和 CountDownLatch 原理类似。

先维护一个静态变量

然后在线程任务结束时,进行静态变量操作:

其实就是加锁计数,循环判断。

Future 是用来装载线程结果的,不过,用这个来进行判断写代码总感觉怪怪的。

因为 Future 只能装载一条线程的返回结果,多条线程总不能用 List 在接收 Future 。

这里就开一个线程做个演示:

这种方式就不写优缺点了,因为 Future 的主要使用场景并不是用于判断任务执行状态。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式