0

0

给女朋友讲 : Java线程池的内部原理

爱谁谁

爱谁谁

发布时间:2025-07-15 10:32:02

|

758人浏览过

|

来源于php中文网

原创

大家好,又见面了,我是你们的朋友全栈君。

给女朋友讲 : Java线程池的内部原理 在灯光的照耀下,餐厅的餐盘显得格外晶莹洁白,女朋友轻轻抿了一口红酒,问我说:“你经常提到线程池,线程池的原理到底是什么?”我愣了一下,心想女朋友今天怎么突然问这么专业的问题,但作为一个专业人士,我不能在她面前露怯啊。于是,我笑着说:“我给你讲讲我前同事老王的故事吧!”

老王是一位在北京打拼了十多年的程序员,由于年纪大了,加班不如年轻人,升迁无望,于是他带着积蓄回老家创业。他选择了洗浴行业,开了一家正规的洗浴中心。因为他之前常去的澡堂叫“清华池”,所以他给自己的洗浴中心取名“线程池”。

线程池洗浴中心开业后,老王发现有顾客想做足疗,于是招聘了一名足疗技师,增加了这项业务,增加了收入。随着做足疗的顾客增多,老王又招聘了四名足疗技师。但后来,老王发现店里已经有五名足疗技师,再招聘就支付不起更多的工资了。足疗技师忙不过来怎么办?老王想到了一个办法:让顾客排队,哪个足疗技师空闲了,就从队伍里叫一个顾客继续做。

周末一到,来洗浴中心的顾客比平时多了几倍,想做足疗的顾客排队时间过长,顾客们已经不耐烦了。老王马上做出反应,从其他洗浴中心紧急招聘了五名足疗技师,为队伍里的顾客做足疗,大大减少了排队时间。不过,有时生意太火爆,紧急招聘的技师也忙不过来,顾客排队时间还是很长,新的顾客来了,老王只能满脸赔笑地说:“您下次再来吧,下次给您找个好技师。”,把顾客拒之门外。周末过后,店里不能养闲人,老王就把紧急招聘的技师都辞退了。

立即学习Java免费学习笔记(深入)”;

老王的生意越做越红火,很快就要开分店、融资上市、走上人生巅峰。既然这么成功,就让我们来复盘一下他的经营之道吧:

Python概述 中文WORD版
Python概述 中文WORD版

本文档主要讲述的是Python概述;Python 对操作系统服务的内置接口,使其成为编写可移植的维护操作系统的管理工具和部件(有时也被称为Shell 工具)的理想工具。Python 程序可以搜索文件和目录树,可以运行其他程序,用进程或线程进行并行处理等等。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

给女朋友讲 : Java线程池的内部原理 如果你了解了老王的经营之道,线程池就不难理解了,把顾客替换成任务,把足疗技师替换成线程线程池洗浴中心就是线程池了,线程池的内部原理就是这样的:

给女朋友讲 : Java线程池的内部原理 梦醒铃铃铃,闹铃把我吵醒,原来是一场梦啊,我哪有什么女朋友?今天上午有一个面试,赶紧起床洗漱完毕,就出发了。在路上回想那个奇怪的梦,不妨再复习一下线程池的内部原理吧! 先看一下ThreadPoolExecutor类的execute方法:

代码语言:javascript代码运行次数:0运行复制```javascript public void execute(Runnable command) { if (command == null) throw new NullPointerException(); //获取clt,clt记录着线程池状态和运行线程数。 int c = ctl.get(); //运行线程数小于核心线程数时,创建线程放入线程池中,并且运行当前任务。 if (workerCountOf(c)

在execute方法中,多次调用的addWorker方法,再看一下这个方法:

代码语言:javascript代码运行次数:0http://www.w3.org/2000/svg"youjiankuohaophpcnzuojiankuohaophpcnpath d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor">运行http://www.w3.org/2000/svg"youjiankuohaophpcnzuojiankuohaophpcnpath clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor" fill-rule="evenodd">复制```javascript private boolean addWorker(Runnable firstTask, boolean core) { retry: for (;;) { //获取clt,clt记录着线程池状态和运行线程数。 int c = ctl.get(); //获取线程池的运行状态。 int rs = runStateOf(c); //线程池处于关闭状态,或者当前任务为null //或者队列不为空,则直接返回失败。 if (rs >= SHUTDOWN && ! (rs == SHUTDOWN && firstTask == null && ! workQueue.isEmpty())) return false; for (;;) { //获取线程池中的线程数 int wc = workerCountOf(c); //线程数超过CAPACITY,则返回false; //这里的core是addWorker方法的第二个参数, //如果为true则根据核心线程数进行比较, //如果为false则根据最大线程数进行比较。 if (wc >= CAPACITY || wc >= (core ? corePoolSize : maximumPoolSize)) return false; //尝试增加线程数,如果成功,则跳出第一个for循环 if (compareAndIncrementWorkerCount(c)) break retry; //如果增加线程数失败,则重新获取ctl c = ctl.get(); //如果当前的运行状态不等于rs,说明状态已被改变, //返回第一个for循环继续执行 if (runStateOf(c) != rs) continue retry; } } boolean workerStarted = false; boolean workerAdded = false; Worker w = null; try { //根据当前任务来创建Worker对象 w = new Worker(firstTask); final Thread t = w.thread; if (t != null) { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { //获得锁以后,重新检查线程池状态 int rs = runStateOf(ctl.get()); if (rs largestPoolSize) largestPoolSize = s; workerAdded = true; } } finally { mainLock.unlock(); } if (workerAdded) { //启动线程,开始运行任务 t.start(); workerStarted = true; } } } finally { if (! workerStarted) addWorkerFailed(w); } return workerStarted;}

面试时,一个穿着格子衬衫的中年男子坐在我面前,对我说:“您好,我是今天的面试官。”我微笑地回应:“您好。”面试官面无表情地问我:“线程池一定用过吧,能说说线程池的内部原理吗?”我差点笑出声来,自信满满地说……

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/90da3608667e990227e76560921e5fa7

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

841

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

738

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.7万人学习

C# 教程
C# 教程

共94课时 | 7.2万人学习

Java 教程
Java 教程

共578课时 | 48.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号