线程池 | 线程如何复用?

本文详细解析线程池的工作机制,包括Worker执行任务模型,线程如何通过addWorker增加,以及Worker如何执行和回收任务。线程复用的关键在于线程池中的线程会不断从阻塞队列中获取任务执行,而线程回收发生在获取不到任务时,此时线程会回收自身并更新线程池状态。
摘要由CSDN通过智能技术生成

线程-线程池

线程池如何复用?


前言

在前面的几篇文章中,我们学习了关于线程的一些基础知识,也了解关于线程状态的流转,接下来我们一起学习线程池。

问题思考:

  1. 线程如何复用?
  2. 线程如何回收?

一、Worker执行任务模型

在这里插入图片描述
主要执行任务的三个角色
Worker-》WorkQueue-》Thread

二、Worker线程如何增加?

涉及参数:

名称 含义
core 如果为true,则与 corePoolSize 绑定。为false,则与 maximumPoolSize 绑定
firstTask 新线程首先要执行的任务,若没有则传null

addWorker源码

private boolean addWorker(Runnable firstTask, boolean core) {
    retry:
        //检测当前线程池状态
    for (;;) {
        //包含线程池状态和线程中有效线程数量
        int c = ctl.get();
        //通过高三位获取线程池状态
        int rs = runStateOf(c);

        // 线程池不处于RUNNABLE状态且现在状态为关系状态,未传入新任务,阻塞队列不为空 返回false
        if (rs >= SHUTDOWN &&
            ! (rs == SHUTDOWN &&
               firstTask == null &&
               ! workQueue.isEmpty()))
            return false;

        for (;;) {
            //通过低29位计算线程池内有效线程的数量
            int wc = workerCountOf(c);
            //超过size,则返回false
            if (wc >= CAPACITY ||
                wc >= (core ? corePoolSize : maximumPoolSize))
                return false;
            //增加工作线程数    
            if (compareAndIncrementWorkerCount(c))
                break retry;
            //再次获取线程池状态和线程中有效线程数量
            c = ctl.get();  // Re-read ctl
            if (runStateOf(c) != rs)
                continue retry;
            // else CAS failed due to workerCount change; retry inner loop
        }
    }

    boolean workerStarted = false;
    boolean workerAdded = false;
    Worker w = null;
    try {
        //创建一个Worker对象,将新任务放入Worker
        w = new Worker(firstTask);
        //实例化一个线程
        final Thread t = w.thread;
        if (t != null) {
            //加锁
            final ReentrantLock mainLock = this.mainLock;
            mainLock.lock();
            try {
                // Recheck while holding lock.
                // Back out on ThreadFactory failure or if
                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值