线程池源码剖析——深入理解线程池

本文剖析线程池源码,手写一个基于生产者-消费者模型的简易线程池,探讨其工作原理及线程池体系架构。深入解读ThreadPoolExecutor,分析线程池的五种状态及其转换。

线程池源码剖析

1. 手写一个简单线程池

目前业界线程池的设计,普遍采用的都是生产者——消费者模型,线程的使用方是生产者,而线程池就是一个消费者;
下面来设计一个简易的线程池MythreadPool,它的设计原理跟我们的ThreadPoolExecutor的设计思想是一致的;

class MythreadPool {
    //用阻塞队列来保存任务
    BlockingQueue<Runnable> workQueue;
    List<WorkThread> workers = new ArrayList<>();
    public MythreadPool(int poolSize, BlockingQueue<Runnable> blockingQueue) {
        this.workQueue = blockingQueue;
        for(int i=0; i<poolSize; i++) {
            WorkThread workThread = new WorkThread();
            workThread.start();
            workers.add(workThread);
        }
    }
    //提交任务
    public void excute(Runnable runnable) {
        workQueue.add(runnable);
    }
    class WorkThread extends Thread {
        @Override
        public void run() {
            //这里是个死循环,所以工作的线程不会结束,会在这里一直等待从阻塞队列中获取任务;
            while (true) {
                try {
                    Runnable task = workQueue.take();
                    task.run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class Test2 {
    public static void main(String[] args) {
        MythreadPool mythreadPool = new MythreadPool(3, new ArrayBlockingQueue<>(3));
        mythreadPool.excute(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello my threadPool!!!!");
            }
        });
    }
}

输出:
hello my threadPool!!!

由于没有实现关闭线程池的方法,上述输出是不会结束的,需强制关闭;

2. 线程池体系架构

Executor是位于juc包下的一个接口;
在这里插入图片描述

可以看到顶层是Executor接口,这个接口就一个方法:

  • void execute(Runnable command);
    

接下来是ExecutorService接口,这个接口作用是:

  • 提供了线程池生命周期的一些管理方法;
    在这里插入图片描述
  • 接下来是AbstractExecutorService,这个抽象类则是具体实现了上面ExecutorService接口中的那些方法;

最下面的就是我们常用的ThreadPoolExecutor,下面具体进行讲解;

2. ThreadPoolExcutor源码解读

1. 工作状态概述

ThradPoolExecutor提供了对线程生命周期的控制,规定线程池有如下五种状态:

  • RUNNING(运行)
    • 能够接受新的任务,也可以处理阻塞队列里面的任务;
  • SHUTDOWN(待关闭)
    • 不能够接受新的任务,继续处理阻塞队列里的任务;
  • STOP(停止)
    • 不能够接受新的任务,也不会处理阻塞队列里的任务,并且会中断正在处理的任务;
  • TIDYING(整理)
    • 所有的任务已经停止,ctl记录的工作线程数为0,线程池会变为TIDYING状态,此状态线程池会执行钩子方法terminated();
  • TERMINATED(终止)
    • 完全终止,且已经释放了所有的资源;

根据源码注释,使用ctl的高三位来表示上面五种状态,低29位来表示线程池中的工作线程数;
所谓的工作线程数,就是已经被允许start并且不允许被停止的线程;

    //ctl是一个原子数,线程安全的(CAS),初始值的设定代表RUNNING状态和工作线程数为0;
    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
	
	//COUNT_BITS即为32-3,为29;
    private static final int COUNT_BITS = Integer.SIZE - 3;
	
	//表示工作线程的最大数,2^29 - 1;
	//即:00011111 11111111 11111111 11111111
    private static final int CAPACITY   = (1 << COUNT_BITS) - 1;

    // runState is stored in the high-order bits
    private static final int RUNNING    = -1 << COUNT_BITS;
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    private static final int STOP       =  1 << COUNT_BITS;
    private static final int TIDYING    =  2 << COUNT_BITS;
    private static final int TERMINATED =  3 << COUNT_BITS;
	
	//获取线程池状态
	//c 来与上CAPACITY取反,即与上:11100000 00000000 00000000 0000000,即取得c的前三位;
    private static int runStateOf(int c)     { return c & ~CAPACITY; }
	
	//获取工作线程数
	//c 来与上CAPACITY,即与上:00011111 11111111 11111111 11111111,即获得c的第27位;
    private static int workerCountOf(int c)  { return c & CAPACITY; }
	
	//将状态与线程数进行或运算,刚好就组成了ctl; 因为rs的低27位全为零,wc的高3位全为0,而0与任意数
	//进行或运算的结果就是那个任意数;
    private static int ctlOf(int rs, int wc) { return rs | wc; }

2. 工作状态的转换

  • (1):RUNNING 转换为 SHUTDOWN :在调用shutdown()方法时;
  • (2):RUNNING或SHUTDOWN 转换为 STOP:调用shutdownNow()方法时;
  • (3):SHUTDOWN 转化为 TIDYING:当阻塞队列和工作线程数都为0时;
  • (4):STOP 转化为 TIDYING:当工作线程数为0时;
  • (5):TIDYING 转化为 TERMINATED:当terminated()钩子方法完成时;

在这里插入图片描述

1. excutor()方法

在这里插入图片描述

【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值