首页 > 编程语言 >源码分析:线程池里新增一个线程的流程是什么

源码分析:线程池里新增一个线程的流程是什么

时间:2024-01-25 16:14:53浏览次数:27  
标签:false 队列 新增 池里 源码 command 线程 addWorker

1、先判断新线程是不是为空,为空就报空指针错误否则就往下运行;

2、判断是否小于核心线程数,小于则直接新增线程否则就往下运行;

3、尝试新增到工作队列中,添加成功就等待调用否则就往下运行;

4、再次尝试新增线程,如果当前线程池的线程数大于线程池容量或最大线程数就触发拒绝策略。

    public void execute(Runnable command) {
        //新任务为空则报空指针
        if (command == null)
            throw new NullPointerException();

        int c = ctl.get();
        //worker指一个线程,这里是判断当前线程数是否小于核心线程数
        if (workerCountOf(c) < corePoolSize) {
            //当前线程数小于核心线程数就直接addWorker,即新增线程
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        //走到这说明当前线程数大于等于核心线程数
        //如果还处于运行状态就尝试加入到工作队列中
        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);
    }

addWorker方法中新增线程时的判断:

                //此处判断线程数如果大于等于容量或者大于等于最大线程数都返回false
                if (wc >= CAPACITY || wc >= (core ? corePoolSize : maximumPoolSize))
                    return false;

 

标签:false,队列,新增,池里,源码,command,线程,addWorker
From: https://www.cnblogs.com/Bernard94/p/17987358

相关文章

  • 源码文件阅读---hooks的使用---使用文心一言读代码
    import{CommonFormTypes}from'globalConstants';import{createContext,useCallback,useState}from'react';import{BoardType}from'../../../DashBoardPage/pages/Board/slice/types';import{VizType}from'./slic......
  • java线程数量如何确定
    1.概述使用线程池的好处降低资源消耗:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,通过重复利用己创建的线程可以降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行提高线程的可管理性:线程池提......
  • iOS 多线程复习
    iOS中的线程主要有四种:1.pThread2.NSThread3.GCD4.NSOpreaction基础知识:线程、任务和队列的概念: 异步、同步&并行、串行的特点:组合特点:  1.pThread C语言所写,面向过程,使用较少.oc:#pragmaMark-pThread-(void)pThreadDemo{pthread_tpthre......
  • java线程池-2
    1.Executors创建线程池的潜在问题在很多公司的编程规范中,非常明确地禁止使用Executors创建线程池。为什么呢?这里从源码讲起,介绍使用Executors工厂方法创建线程池将会面临的潜在问题。1.1Executors创建固定数量的线程池的潜在问题使用newFixedThreadPool工厂方法固定数......
  • GDB调试之多线程死锁调试(二十四)
    调试代码如下所示:#include<thread>#include<iostream>#include<vector>#include<mutex>usingnamespacestd;mutex_mutex1;mutex_mutex2;intdata1;intdata2;intdo_work_1(){ std::cout<<"线程函数do_work_1开始"<<......
  • 通达信牛筹码主图指标 超短筹 短中长筹码统计 源码附图
    源码解析:筹码集中度赋值:(获利盘为90+(100-90)/2%的成本分布-获利盘为(100-90)/2%的成本分布)/(获利盘为90+(100-90)/2%的成本分布+获利盘为(100-90)/2%的成本分布)+收盘价输出超短筹:筹码集中度的10日指数移动平均的3日简单移动平均输出短筹:筹码集中度的20日指数移动平均的3日......
  • rust使用lazy_static对全局变量多线程并发读写示例
    首先需要在项目依赖Cargo.toml添加lazy_static依赖项[dependencies]lazy_static="1.4.0"示例代码如下:uselazy_static::lazy_static;usestd::sync::{RwLock,RwLockReadGuard,RwLockWriteGuard};usestd::thread;#[derive(Debug)]structSharedData{data:Vec<......
  • jmeter读取csv文件控制多线程不重复读取
    在Jmeter中设置并发为S,循环次数为N时,参数化文件可能被重复读取N次,无法保证每次读取的数据均不一样,此处介绍保证数据不重复的方法。在线程组下添加一个CSVDataSetConfig,具体配置如下图:将配置中默认:RecycleonEOF=True,StopthreadonEOF=False修改为:RecycleonEO......
  • Java 多线程交替打印
    目录题目方案一:synchronized方法二:ReentrantLock方法三:ReentrantLock+Condition(非公平锁)方法四:ReentrantLock+Condition(公平锁)方法五:Semaphore题目使用三个线程T1、T2、T3,如何让他们按顺序交替打印10次ABC。方案一:synchronizedpublicclassSynchronizedLockPrint......
  • 支付宝:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!
    1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。2,在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程......