1.5 关闭线程池

简介

线程池中有很多关闭线程池的方法,当业务需要的使用我们可以使用这些方法来关闭线程。

shutdown

当调用线程池的shutdown方法时,线程中的任务并不会立刻停止,而是当调用shutdown方法后,线程池将不会接收新的任务,当线程和队列中的任务都计算完成后,这个线程池才会被销毁。

isShutdown

isShutdown()方法可以判断是否调用过shutdown()方法

isTerminated

使用isTerminated()方法来判断线程池是否真正的停止了(计算完shutdown之前的任务后)

showdownNow

showdownNow()方法是立刻停止,并且返回队列中为执行的任务集合

codeing

package pres.bik.lean.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * shutdown
 * @author yangkaifei
 * @version 1.0
 * @date 2021/11/28 9:08 下午
 */
public class ShutDownLean {

    /**
     * 线程池
     */
    private static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(10);

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            int finalI = i;
            EXECUTOR_SERVICE.execute(new Thread(() -> {
                System.out.println("线程被执行" + finalI);
            }));
        }
        System.out.println("shutdown");
        System.out.println(EXECUTOR_SERVICE.isShutdown());
        EXECUTOR_SERVICE.shutdown();
        System.out.println(EXECUTOR_SERVICE.isShutdown());
        System.out.println("再次提交新的任务");
        System.out.println(EXECUTOR_SERVICE.isTerminated());
        EXECUTOR_SERVICE.execute(new Thread(()->{
            System.out.println("新任务");
        }));
    }
}

运行结果

线程被执行0
线程被执行3
线程被执行4
线程被执行1
线程被执行2
线程被执行5
线程被执行6
线程被执行7
线程被执行8
线程被执行10
线程被执行9
线程被执行12
线程被执行15
线程被执行11
线程被执行19
线程被执行17
线程被执行18
shutdown
线程被执行16
线程被执行14
线程被执行13
false
true
再次提交新的任务
false
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task Thread[Thread-20,5,main] rejected from java.util.concurrent.ThreadPoolExecutor@4e50df2e[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 20]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at pres.bik.lean.concurrent.ShutDownLean.main(ShutDownLean.java:32)

分析

  1. 当调用线程池的shutdown()方法后,新的任务将不能再次被提交。
  2. 可以看到第一次打印isShutdown的时候是false,因为这个时候还没有调用isShutdown
  3. 当第二次打印isShutdown的时候是true,因为已经调用了isShutdown方法
  4. 当打印isTerminated的时候是false,正确线程池并没有被完成停止,还有任务在执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值