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是一种松耦合关系,非常灵活!

相关推荐
武子康35 分钟前
权重已到、Recipe 还在变:Kimi K3 发布后该怎样做工程验收
人工智能·后端·agent
站大爷IP1 小时前
列表推导式一用就爽?大数据量下它把我服务器内存榨干了,原来生成器才是yyds
后端
Slice_cy1 小时前
Mint 自研框架设计与实现:从重复开发走向配置驱动(二)
前端·后端·架构
程序员cxuan1 小时前
OpenAI 把 Hugging Face 打穿了,然后 GLM 5.2 当了救火队长?
人工智能·后端·程序员
程序员天天困2 小时前
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
java·jvm·后端
今夜有雨.2 小时前
C++JSON 解析器
c++·笔记·后端·学习·json
AskHarries2 小时前
日志系统怎么搭
后端
swipe2 小时前
09|(前端转全栈)商品为什么不能随便上下架?后端状态机思维入门
前端·后端·全栈
zhangjw342 小时前
第36篇:Spring Boot进阶:Web开发+参数校验+全局异常处理
前端·spring boot·后端