【并发编程】- 线程池使用方法isTerminating()和isTerminated()监听关闭状态

663 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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方法判断大门是否已经关闭了。