【JUC】ThreadPoolExecutor任务执行-execute

任务执行

ThreadPoolExecutor执行任务的主要方法为:execute、submit、invoke及其重载。

execute

execute 函数定义

public void execute(Runnable command) 

execute函数功能说明

提交任务到线程池执行。

execute源码

if (command == null)
    throw new NullPointerException();
// 获取ctl
int c = ctl.get();
// 计算当前线程池中的worker数量是否小于corePoolSize
// 线程池线程数量小于corePoolSize就立即添加worker执行任务
if (workerCountOf(c) < corePoolSize) {
    // 如果小于corePoolSize则新建线程向线程池中添加该线程
    if (addWorker(command, true))
        // 添加线程成功直接return
        return;
    c = ctl.get();
}

// 下面代码处理任务没有直接添加worker执行场景,就是线程池当前的线程数大于等于corePoolSize场景
// 如果线程池处于RUNNING状态,那么就将任务添加到等待队列中
 if (isRunning(c) && workQueue.offer(command)) {
    int recheck = ctl.get();
    // 将任务添加到队列后再次检查是否线程池是否处于运行状态
    // 如果线程池不在运行状态,那么就将任务从任务队列中移除
    // 并且调用Reject策略
    if (! isRunning(recheck) && remove(command))
        reject(command);
    // 检查worker数量是否为0,如果为0则向线程池添加worker
    // 如果进入到这个分支的话,那么线程池处于RUNNING状态或者线程池不处于RUNNING状态且从工作队列中移除任务失败
    // 这里检查工作线程是否为0是为了防止线程池没有可以执行任务的线程
    else if (workerCountOf(recheck) == 0)
        addWorker(null, false);
}
// 如果线程池不处于运行状态或者任务不能入队就尝试添加线程池,那么这里会尝试增加工作线程数量
// 如果线程没有新建成功,那么此时线程池可能已经停止或者饱和(已经达到最大线程数且队列已经达到最大数量)
// 那么就调用Reject策略
else if (!addWorker(command, false))
    reject(command);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值