1-5 线程池:Thread+阻塞队列+循环

今天我们要带大家探究Java线程池的运行机制,但在这之前,需要先复习一下线程。

Thread的设计理念

假设现在是1990年代,而你是Sun公司的核心开发,是Java这门语言的设计者之一。在这次发版时,你们希望Java能够支持多线程,比如同时执行A、B两个任务。

作为抽象大师,你很自然地想到要设计一个Thread类。

new Thread().start(),启动一个子线程执行任务B

任务A和任务B同时执行

但这样一来,Thread中的任务就硬编码 了,new Thread().start()执行的永远是任务B。好在Java支持继承,子类继承Thread后可以重写run方法。

这样一来,new Thread2().start()执行的就是任务C

但还是不够灵活。假设我希望任务C在被Thread2执行的同时,还能提交给一个线程池执行,目前这种基于继承的设计就有点无能为力:任务C和Thread是一个整体,要想提交任务C,只能提交整个Thread对象,但线程池不支持提交Thread对象!

更好的做法是,把任务和线程拆分开,让任务和线程彼此都更纯粹。

由于Java并不像JavaScript那样直接支持Function类型,所以要想把任务从Thread拆出来,只能设计一个interface或者class承接。经过权衡,我们最终选择interface,设计了Runnable接口。

run方法:负责承接任务

以任务C为例,如果要把任务C从Thread2中拆出来,可以这么做:

任务C被拆出来以后,Thread的职责变得单一了,回归到最初的设计。

好,现在我们有了1个Thread(线程)和1个Runnable(任务),目前它俩毫无关系。如何让Thread执行Runnable呢?换句话说,如何Thread和Runnable产生关联呢?

组合!

Thread内部维护一个Runnable:需要被执行的任务

Thread和Runnable是一种松耦合关系,非常灵活!

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
大勇前进5 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu5 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile5 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白805 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙5 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发5 天前
软件工程SOLID 五大设计原则
后端·软件工程