shutdownNow的原理及不生效的原因
CC.getCachedThreadPool().execute(() -> {
try {
for (int i = 0; i < 100000000; i++) {
System.out.println("---------U线程运行中---------" + i);
Thread.sleep(1000 );
}
}catch (Exception e){
}
});
BB.getCachedThreadPool().execute(() -> {
for(int i =0;i < 1000000000;i++){addInt("H","nb");
System.out.println("---------H线程运行中---------"+ i);
try {
Thread.sleep(1000 );
}catch (InterruptedException e){
}}
});
/**
* 关闭线程池
*/
public synchronized void ShutdownThreadPool() {
if (this.cachedThreadPool != null) {
this.cachedThreadPool.shutdownNow();
}
if (this.OrderThreadPool != null) {
this.OrderThreadPool.shutdownNow();
}
if (this.OrderThreadPool2 != null) {
this.OrderThreadPool2.shutdownNow();
}
if (this.CancelThreadPool != null) {
this.CancelThreadPool.shutdownNow();
}
if (this.singleThread != null) {
this.singleThread.shutdownNow();
}
if (this.scheduleThreadPool != null) {
this.scheduleThreadPool.shutdownNow();
}
if (this.forkJoinThreadPool != null) {
this.forkJoinThreadPool.shutdownNow();
}
}
@RequestMapping("/testShutdownALL")
public boolean testShutdownALL() {
paramMapNew.get("ZZZ").ShutdownThreadPool();
paramMapNew.get("HHH").ShutdownThreadPool();
paramMapNew.get("TTT").ShutdownThreadPool();
return true;
}
shutdownNow()通过将线程池的状态改成STOP,当再将执行execute提交任务时,如果测试到状态不为RUNNING,则抛出rejectedExecution,从而达到阻止新任务提交的目的.,所以如果try(){}没有覆盖到,就无法捕获异常进行中断.