49.线程池的关闭方法

本文详细介绍了Java线程池的关闭方法,包括shutdown方法(不接受新任务,等待已提交任务完成,不会阻塞调用线程),shutdownNow方法(尝试停止所有正在执行的任务,返回未执行任务),以及isShutdown、isTerminated和awaitTermination等辅助方法的用途。了解这些方法有助于更好地控制和管理线程池的生命周期。
摘要由CSDN通过智能技术生成

shutdown方法

1.线程池状态变为shutdown

2.不会接收新任务

3.已提交的任务会执行完

4.此方法不会阻塞调用线程执行

ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(() -> {
           log.debug("task1 running");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("task1 finished");
        });
        executorService.submit(() -> {
            log.debug("task2 running");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("task2 finished");
        });
        executorService.submit(() -> {
            log.debug("task3 running");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("task3 finished");
        });

        log.debug("shutdown");
        executorService.shutdown();

shutdownNow方法

1.线程池的状态变为STOP

2.不会接受新任务

3.会将队列中的任务返回

4.并用interrupt的方式中断正在执行中的任务

ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(() -> {
           log.debug("task1 running");
            try {
                TimeUnit.SECONDS.sleep(2);
                log.debug("task1 finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        executorService.submit(() -> {
            log.debug("task2 running");
            try {
                TimeUnit.SECONDS.sleep(2);
                log.debug("task2 finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        executorService.submit(() -> {
            log.debug("task3 running");
            try {
                TimeUnit.SECONDS.sleep(5);
                log.debug("task3 finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        log.debug("shutdownNow");
        //队列中的任务会返回到List<Runnable>集合中
        List<Runnable> runnables = executorService.shutdownNow();
        log.debug("runnables={}", runnables);
        log.debug("other....");

isShutdown方法

只要线程池的状态不是RUNNING, 此方法就返回true。

isTerminated方法

判断线程池的状态是否为TERMINATED。

awaitTermination方法

调用shutdown后,由于调用线程并不会等待所有任务运行结束,因此如果它想在线程池TERMINATED后做些事情,可以利用此方法等待。但是我们并不知道线程池中的任务多久才能全部执行完,也就无法知道awaitTermination方法设置的超时时间是多久。还是可能用submit方法返回的future结果来判定线程池中的每个任务是否执行完毕。

ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(() -> {
           log.debug("task1 running");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("task1 finished");
        });
        executorService.submit(() -> {
            log.debug("task2 running");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("task2 finished");
        });
        executorService.submit(() -> {
            log.debug("task3 running");
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("task3 finished");
        });

        log.debug("shutdown");
        executorService.shutdown();
        log.debug("other....");//调用shutdown方法后,主线程不会因为线程池中的线程没有运行结束而阻塞
        try {
            //如果想等线程池中的线程执行完后做一些后续操作,可以使用awaitTermination方法等待指定时间
            //时间等够了也就是超时了,或者线程池中的线程都执行完了,才会继续向下执行
            executorService.awaitTermination(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.debug("done...");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷土重来…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值