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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5种方法,教你判断线程池是不是全部完成相关的知识,希望对你有一定的参考价值。

参考技术A 最近写小玩具的时候用到了 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 的主要使用场景并不是用于判断任务执行状态。

以上是关于5种方法,教你判断线程池是不是全部完成的主要内容,如果未能解决你的问题,请参考以下文章

字节二面:判断线程池是否全部完成的 5 种方法,还有谁不会??

线程池判断是不是执行完毕

Java如何判断线程池所有任务是不是执行完毕

如何判断线程池中的线程是否全部执行完毕

如何判断线程池中的线程是否全部执行完毕

如何判断线程池中的线程是否全部执行完毕