java-线程池源码分析

10 篇文章 0 订阅

线程池停止 3种方法

ExecutorService 接口种的方法
    void shutdown(); 
    List<Runnable> shutdownNow();
    boolean isShutdown();
    boolean isTerminated();
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
shutdown
  • 调用这个方法不是彻底的关闭线程池
  • 在任务在执行一半的时候,或者在队列种还有任务为执行,执行这个方法。他会将把所有任务都执行完了之后才会停止。
如何知道线程是否停止
isShutdown(); 如果此执行程序已关闭,则返回true 。
shutdownNow();
这个方法就很暴力直接 停止线程池
isTerminated()
线程池时候彻底停止
awaitTermination()
检查线程池 是否在指定时间停止
线程池停止之后不可以在向线程池中提交任务

上代码演示

public class ShutdownPool {
    @SneakyThrows
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0, size = 1000; i < size; i++) {
            executorService.execute(new Task());
        }
        //Thread.sleep(1000);
        //executorService.shutdown();
        executorService.shutdownNow();
        
        System.out.println(executorService.awaitTermination(2L, TimeUnit.MINUTES));
    
        //System.out.println(executorService.isShutdown());
        //System.out.println(executorService.isTerminated());
        //Thread.sleep(1000);
        //executorService.execute(new Task());
    }
}

class Task implements Runnable {
    
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"业务代码哈哈");
    }
}

在这里插入图片描述

/**
分 3 步进行:
 1. 如果运行的线程少于 corePoolSize,尝试使用给定命令启动一个新线程作为其第一个任务。对 addWorker 的调用以原子方式检查 runState 和 workerCount,因此通过返回 false 来防止在不应该添加线程时添加线程的错误警报。
 2. 如果一个任务可以成功排队,那么我们仍然需要仔细检查我们是否应该添加一个线程(因为现有的线程自上次检查后死亡)或者池在进入此方法后关闭。因此,我们重新检查状态,如果有必要,如果停止排队,则回滚,或者如果没有,则启动一个新线程。
 3.  3.如果我们不能排队任务,那么我们尝试添加一个新线程。如果它失败了,我们知道我们已经关闭或饱和,因此拒绝任务。
**/
public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get();
        // 线程数量是否 小于 核心线程数
        if (workerCountOf(c) < corePoolSize) {
        // 开启对任务的执行
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        // c < SHUTDOWN   并且要插入到工作队列
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            // 没有运行  并且已经删除  抛出异常
            if (! isRunning(recheck) && remove(command))
                reject(command);
                // 对工作队列中的任务进行执行
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }
线程池中的五种状态
    private static final int RUNNING    = -1 << COUNT_BITS;  可以执行和接受新的任务
    private static final int SHUTDOWN   =  0 << COUNT_BITS;  不接受新任务,可以执行已经存在的任务
    private static final int STOP       =  1 << COUNT_BITS;  不接受,也不执行已经存在的任务
    private static final int TIDYING    =  2 << COUNT_BITS;   所有任务停止后  执行钩子方法
    private static final int TERMINATED =  3 << COUNT_BITS;   钩子方法停止后  彻底停止

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SteveCode.

永远年轻,永远热泪盈眶

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

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

打赏作者

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

抵扣说明:

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

余额充值