线程池原理简谈

1,概述

线程池是一种池化技术,本质是减少线程对象创建销毁的开销,同对象池、连接池一样,达到对象复用的效果。那么线程池怎么复用呢?即一个或多个Thread对象怎么执行更多的Task?这里面的关键就涉及到了阻塞队列。

其一,所谓阻塞队列,是借助锁实现的生产-消费模型,

以BlockLinkedList为例,其taskFirst方法,通过notEmpy,即Condition实现阻塞等待功能,而Condition内部使用了AQS来实现锁的功能,详情可见Java Lock源码解读-CSDN博客

其二,一个线程池有一个极限,即所有的线程对象都在被使用,且达到了最大池数量时,该怎么办呢?这时就产生了Reject策略;

其三,其他参数有

核心线程池数,懒加载式创建;

最大线程数,

线程存活时间,即非核心线程的阻塞等待时间,blockQueue.poll(timeout),

线程工厂,创建线程对象的工厂模式

2,ThreadPoolExecutor解读

以一个简单例子,即ThreadPoolExecutor类为例。

完成构造参数如上,

需要理清除池化技术的实现,

1,如何生产Command?

通过execute方法,

逻辑清晰,

1,如果小于核心线程数时,直接addWorker一个

2,如果线程池状态是RUNNING,并且提供阻塞队列workQueue成功,recheck下状态二重检查,如果check pass则什么都不用做。workQueue.offer提供的command,多个消费者会通过workQueue.take获取。

3,最后,如果添加到非核心线程失败,即addWorker(command,false)返回false,则使用拒绝策略,

addWorker,添加到线程池具体Worker职责。

笔者看下addWorker细节,

这个函数第一段式,

通过CAS操作count+1,如果当前线程池状态是SHUTDOWN或STOP,直接失败。

通过core参数判断是否达到对应最大值,如果达到直接失败。

只有CAS操作成功,才break retry,进入第二段式。

1,创建一个Worker,并且传入第一个task作为参数,并且通过线程工厂创建一个Thread对象,注意newThread时将worker自己传入,其woeker实现了Runnable接口,

另外,Worker实现了AQS,初始状态setState为-1,表示创建时阻止中断。

2,使用mainLock,将新创建的work加入wokers中,

3,添加workers成功后,直接start

4,跟进到Worker#run方法,

通过runWorker启动了一个线程,笔者看下此函数细节。

1,task赋值firstTask,第一次运行不用通过从workQueue中获取task,

2,w.unlock,前文创建Worker时值-1,unlock传release传入-1,state是0,可响应中断。

3,进入无限循环,第一个task不为null,则加锁后执行task。

4,后续的task通过从getTask中获取。

当线程池状态为SHUTDOWN且STOP且队列中没有task时,返回null,线程对象就能在runWorker中返回而被销毁。

否则,通过keepAliveTime参数从阻塞队列中获取task,如果超时,r取值null,timeOut为true,符合条件的线程会退出循环而销毁。

核心便是从workQueue中获取task。

至此,线程池原理完毕。

笔者再啰嗦下,阻塞队列的超时怎么实现的?

答案很简单,通过Condition#awaitNanos传入超时时间即可在超时时返回,更具体是内部通过AQS实现调度,详见Java Lock源码解读-CSDN博客#Condition相关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/688466.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

picoCTF-Web Exploitation-Most Cookies

Description Alright, enough of using my own encryption. Flask session cookies should be plenty secure! server.py http://mercury.picoctf.net:53700/ Hints How secure is a flask cookie? 我们先下载server.py,分析逻辑 from flask import Flask, render…

JWT生成RSA密钥文档

JWT生成RSA密钥文档 创建jwt文件夹 创建jwt文件夹 进入文件夹 进入jwt文件夹,输入cmd,如图 3、生成公钥私钥 keytool -genkeypair -alias pdm -keyalg RSA -keypass Gacrnd#123 -keystore pdm.jks -storepass Gacrnd#123 -alias:密钥的别名…

一种简单的小报表本地缓存方案

适应如下场景:关联表多,接口响应慢,报表数据不多,可能就十多行。参数也固定,实时性要求不高,隔那么半小时刷新一次,查询性能要求高,给领导看的,要求很快。 使用示例&…

(三十九)第 6 章 树和二叉树(二叉树的三叉链表存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrc…

【Web后端】Tomcat简介_安装_解决乱码_idea配置

1.1 简介 tomcat是在oracle公司的ISWDK(lavaServer Web DelevopmentKit)的基础上发展起来的一个优秀的开源的servlet容器tomcat使用java语言编写。运行稳定、可靠、效率高&#xff0c;可以和目前 主流web服务器一起工作(如IIS、Apache、 Nginx)tomcat是Apache软件基金会(Apach…

黏土滤镜制作方法:探索黏土特效制作的魅力

在数字时代&#xff0c;图像处理已经成为我们生活的一部分&#xff0c;无论是社交媒体上的照片分享&#xff0c;还是专业设计领域的创作&#xff0c;都离不开对图像的精心处理。而黏土滤镜&#xff0c;作为一种独特而富有艺术感的图像处理效果&#xff0c;受到了越来越多人的喜…

存内计算加速大模型——REM-CiM的RGB-事件融合多模态类比计算内存(CiM)技术

本文为大模型&存内计算融合专题的首篇文章&#xff0c;我们将以这篇名为《REM-CiM: Attentional RGB-Event Fusion Multi-modal Analog CiM for Area/Energy-efficient Edge Object Detection during both Day and Night》为例[1]&#xff0c;探讨其在文中提到的多模态大模…

贵金属价格持续走高是投资机会吗?

在当前的金融市场环境&#xff0c;黄金、白银等贵金属价格一直上涨&#xff0c;吸引了众多投资者的关注。那么&#xff0c;贵金属价格持续走高是否是一个投资机会&#xff1f;可以明确的是贵金属价格上涨确实存在投资机会&#xff0c;但投资者需审慎分析各种因素并制定合理的投…

开发利器 - docker 安装运行 mysql

本文选择安装的mysql版本为5.7 &#xff0c;安装环境 mac 1、查看镜像是否存在 docker search mysql:5.7 2、拉取镜像 docker pull mysql:5.7 3、运行镜像 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot1234 -d mysql:5.7 --name&#xff1a;指定容器…

Leetcode—796. 旋转字符串【简单】

2024每日刷题&#xff08;132&#xff09; Leetcode—796. 旋转字符串 实现代码 class Solution { public:bool rotateString(string s, string goal) {return ((s.length() goal.length()) && (s s).find(goal) ! string::npos);} };运行结果 之后我会持续更新&am…

水表智能抄表系统是什么?

水表智能抄表系统是一种现代化水资源保护专用工具&#xff0c;它利用先进的物联网、云计算和大数据剖析&#xff0c;完成了智能抄表、实时监控系统、数据分析等作用&#xff0c;大大提高了水务管理的效率和精确性。 1.功能特点 1.1远程控制自动抄表 传统水表抄水表方法采用人…

2万字干货:如何从0到1搭建一套会员体系(3)

开始本节前还是有个问题&#xff1a;为什么产品需要积分&#xff0c;或积分有什么意义&#xff1f; 有很多公司或产品&#xff0c;在没有想清楚上面这个问题的时候&#xff0c;就在产品体系&#xff08;或会员体系&#xff09;中加入了积分&#xff0c;并用“提升用户活跃和忠诚…