线程池

/*shutdown 方法将执行平缓的关闭过程:不在接受新的任务,同时等待已经提交的任务执行完成---包括那些还未开始执行的任务。
shutdown():
将线程池状态置为SHUTDOWN,并不会立即停止:
1)停止接收外部submit的任务
2)内部正在跑的任务和队列里等待的任务,会执行完
3)等到第二步完成后,才真正停止

shutdownNow 方法将执行粗暴的关闭过程:他将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。
shutdownNow():
将线程池状态置为STOP。企图立即停止,事实上不一定:
1)跟shutdown()一样,先停止接收外部提交的任务
2)忽略队列里等待的任务
3)尝试将正在跑的任务interrupt中断
4)返回未执行的任务列表
SM:它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,
如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。
所以,ShutdownNow()并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。
但是大多数时候是能立即退出的

isShutdown 判断之前是否调用过shutdown
isTerminated 判断所有提交的任务是否完成(保证之前调用过shutdown方法)

awaitTermination 调用shutdown方法后,等待所有任务执行完成
当前线程阻塞,直到
1)等所有已提交的任务(包括正在跑的和队列中等待的)执行完
2)或者等超时时间到
3)或者线程被中断,抛出InterruptedException
4)然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)

【shutdown()和awaitTermination()的区别】
shutdown()后,不能再提交新的任务进去;但是awaitTermination()后,可以继续提交。
awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()不阻塞。

【总结】
1)优雅的关闭,用shutdown()
2)想立马关闭,并得到未执行任务列表,用shutdownNow()
3)优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination()
4)关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()*/

//0
/*pool.shutdown();//只是不能再提交新任务,等待执行的任务不受影响
while (!pool.isTerminated()) {
pool.awaitTermination(3, TimeUnit.SECONDS);
}
System.out.println("线程池已经关闭,线程池中的任务全部执行完毕!");*/

//1
/*while (!pool.awaitTermination(3, TimeUnit.SECONDS)) {
System.out.println("isTerminated:" + service.isTerminated());
}
System.out.println("线程池已经关闭");*/

//2
/*try {
boolean loop = true;
do { //等待所有任务完成
loop = !pool.awaitTermination(3, TimeUnit.SECONDS); //阻塞,直到线程池里所有任务结束
} while(loop);
} catch (InterruptedException e) {
e.printStackTrace();
} */

//3
/*System.out.println("开始等待");
boolean b = pool.awaitTermination(3, TimeUnit.SECONDS);
System.out.println("等待完毕");
if(b){
System.out.println("分线程已经结束");
}
//第一个参数指定的是时间,第二个参数指定的是时间单位(当前是秒)。返回值类型为boolean型。
//1️⃣如果等待的时间超过指定的时间,但是线程池中的线程运行完毕,那么awaitTermination()返回true。输出“分线程已结束”。
//2️⃣如果等待的时间超过指定的时间,但是线程池中的线程未运行完毕,那么awaitTermination()返回false。不输出“分线程已结束”。
//3️⃣如果等待时间没有超过指定时间,等待!*/
原文地址:https://www.cnblogs.com/qxqbk/p/11044657.html