持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
线程池调用方法isTerminating()和isTerminated()
正在执行的程序处于shutdown或shutdownNow之后处于正在终止但尚未完全终止的过程中,调用方法isTerminating()则返回true。此方法类似于门是否正在关闭,门彻底关闭时,线程池也就关闭了。
线程池关闭后就是所有任务都已完成,则方法isTerminated()返回true。此方法代表着门是否已经关闭。
线程执行的代码如下:
public class FirstRunnable implements Runnable {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() +" 开始时间:"+System.currentTimeMillis());
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() +" 结束时间:"+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
实现类代码如下:
public class IsTerminateRun {
public static void main(String[] args) {
FirstRunnable firstRunnable = new FirstRunnable();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 6, 999, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
for (int i = 0; i < 4 ; i++) {
threadPoolExecutor.execute(firstRunnable);
}
System.out.println("线程池正在关闭:"+threadPoolExecutor.isTerminating()+" 线程池完全关闭:"+threadPoolExecutor.isTerminated());
threadPoolExecutor.shutdown();
try {
Thread.sleep(1000);
System.out.println("线程池正在关闭:"+threadPoolExecutor.isTerminating()+" 线程池完全关闭:"+threadPoolExecutor.isTerminated());
Thread.sleep(1000);
System.out.println("线程池正在关闭:"+threadPoolExecutor.isTerminating()+" 线程池完全关闭:"+threadPoolExecutor.isTerminated());
Thread.sleep(1000);
System.out.println("线程池正在关闭:"+threadPoolExecutor.isTerminating()+" 线程池完全关闭:"+threadPoolExecutor.isTerminated());
Thread.sleep(1000);
System.out.println("线程池正在关闭:"+threadPoolExecutor.isTerminating()+" 线程池完全关闭:"+threadPoolExecutor.isTerminated());
Thread.sleep(1000);
System.out.println("线程池正在关闭:"+threadPoolExecutor.isTerminating()+" 线程池完全关闭:"+threadPoolExecutor.isTerminated());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
pool-1-thread-1 开始时间:1655188934590
pool-1-thread-2 开始时间:1655188934591
线程池正在关闭:false 线程池完全关闭:false
线程池正在关闭:true 线程池完全关闭:false
pool-1-thread-1 结束时间:1655188935595
pool-1-thread-1 开始时间:1655188935597
pool-1-thread-2 结束时间:1655188935598
pool-1-thread-2 开始时间:1655188935598
pool-1-thread-1 结束时间:1655188936598
线程池正在关闭:true 线程池完全关闭:false
pool-1-thread-2 结束时间:1655188936613
线程池正在关闭:false 线程池完全关闭:true
线程池正在关闭:false 线程池完全关闭:true
线程池正在关闭:false 线程池完全关闭:true
从运行结果看出方法shutdown()或shutdownNow()的作用是发出一个关闭大门的命令,方法isShutdown()是判断这个关闭大门的命令发出或者未发出。isTerminating()代表大门是否正在关闭进行中,而isTerminated方法判断大门是否已经关闭了。