当前位置:   article > 正文

ThreadPoolExecutor的execute方法执行流程_threadpoolexecutor execute

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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/1008768
推荐阅读
相关标签
  

闽ICP备14008679号