ThreadPoolExecutor的execute方法执行流程

ThreadPoolExecutor的execute方法执行流程

前言

【Java线程池01】Java线程池简介

此文中对Java线程池简介,包含线程池相关的几个类的关系等。

【Java线程池02】ThreadPoolExecutor类概述

此文介绍了ThreadPoolExecutor的构造函数、核心字段以及核心方法

这篇文章将学习总结ThreadPoolExecutor的核心方法execute的执行流程

*源码

**

在这里插入图片描述
源码分析
在这里插入图片描述
从上述执行流程中我们可以得知,其核心点为addWorker方法,下篇文章将详细分析总结addWorker方法。

理解ThreadPoolExecutor中execute()方法原理

首先普及一下什么使ctl

ctl位操作变量

ThreadPoolExecutor有一个AtomicInteger变量,叫ctl(control的简写),一共32位,

高3位为线程池的状态runstatus(5中:Running,Shutdown,Stop,Tidying,Terminate),

低29位存当前有效线程数workerCount
在这里插入图片描述
分析execute()方法的原理

下面是execute的源码

public void execute(Runnable command) {
    if (command == null)
        throw new NullPointerException();

    int c = ctl.get();
//判断工作线程数小于核心线程数
    if (workerCountOf(c) < corePoolSize) {
        //执行addworker,创建一个核心线程,创建失败重新获取ctl
        if (addWorker(command, true))
            return;
        c = ctl.get();
    }
//如果工作线程数大于核心线程数,判断线程池的状态是否为running,并且可以添加进队列
//如果线程池不是running状态,则执行拒绝策略,(还是会调用一次addworker)
    if (isRunning(c) && workQueue.offer(command)) {
        //再次获取ctl,进行双重检索
        int recheck = ctl.get();
        //如果线程池是不是处于RUNNING的状态,那么就会将任务从队列中移除, 
        //如果移除失败,则会判断工作线程是否为0 ,如果过为0 就创建一个非核心线程 
        //如果移除成功,就执行拒绝策略,因为线程池已经不可用了;
        if (! isRunning(recheck) && remove(command))
            reject(command);
        else if (workerCountOf(recheck) == 0)
            addWorker(null, false);
    }

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值