学一学别人,放张图,引狼。。。。
概述
最近写小玩具的时候用到了 CountDownLatch
计数器,然后顺便想了想判断线程池全部结束有多少种方法。
在网上搜了下,可能有些没找到,但是我找到的有(所有方法都是在 ThreadPoolExecutor 线程池方法下测试的):
- isTerminated() 判断方式,在执行 shutdown() ,关闭线程池后,判断是否所有任务已经完成。
- ThreadPoolExecutor 的 getCompletedTaskCount() 方法,判断完成任务数和全部任务数是否相等。
- CountDownLatch 计数器,使用闭锁计数来判断是否全部完成。
- 手动维护一个公共计数 ,原理和闭锁类似,就是更加灵活。
- 使用 submit 向线程池提交任务,Future 判断任务执行状态。
好嘞,现在开始一个一个介绍优缺点和简要原理;
先创建一个 static 线程池,后面好几个例子就不一一创建了,全部用这个就行了:
/**
* 创建一个最大线程数是20的线程池
*/
public static ThreadPoolExecutor pool = new ThreadPoolExecutor(
10, 20, 0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>());
然后再准备一个通用的睡眠方法:
/**
* 线程执行方法,随机等待0到10秒
*/
private static void sleepMtehod(int index){
try {
long sleepTime = new Double(Math.random() * 10000).longValue();
Thread.sleep(sleepTime);
System.out.println("当前线程执行结束: " + index);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
这个方法就是为了测试的时候区分线程执行完毕的下顺序而已。
好嘞,准备完毕,现在开始。
isTerminated 方式
首先贴上测试代码:
private static void shutdownTest