5种方法,教你判断线程池是否全部完成
1个回答
展开全部
最近写小玩具的时候用到了 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 的主要使用场景并不是用于判断任务执行状态。
在网上搜了下,可能有些没找到,但是我找到的有(所有方法都是在 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 的主要使用场景并不是用于判断任务执行状态。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询