线程池ThreadPoolExecutor源码分析(二)--ThreadPoolExecutor添加任务工作单元addWorker()

本文详细分析了ThreadPoolExecutor的addWorker()方法,包括其双重循环用于判断线程池状态和增加线程数的逻辑,以及如何安全地添加任务到线程池并启动执行。在第一部分,外层循环检查线程池状态,内层循环确保不超出最大线程数。若线程启动失败,会进行清理工作。
摘要由CSDN通过智能技术生成

在这里插入图片描述

addWorker()主要分两个部分
第一部分双重循环的目的是判断线程池的状态,若是当前线程池可以创建线程则通过 CAS 操作增加线程数;
第二部分主要是把并发安全的任务加到 workers 里面,并且启动任务执行

private boolean addWorker(Runnable firstTask, boolean core) {
   
        retry:
        for (;;) {
   
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN &&
                ! (rs == SHUTDOWN &&
                   firstTask == null &&
                   ! workQueue.isEmpty()))
                return false;

            for (;;) {
   
                int wc = workerCountOf(c);
                if (wc >= CAPACITY ||
                    wc >= (core ? corePoolSize : maximumPoolSize))
                    return false;
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值