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

相关推荐
笃行35016 小时前
SQLServer数据迁移之后,那张报表还能不能秒出
后端
LucianaiB16 小时前
别再被 AI 骗了:我把腾讯云 4 个 Skill 做成了个「AI 打假侦探」,过程的一个小配置坑惨了我
后端
candyTong17 小时前
Claude Code 如何恢复一段会话
后端·架构·ai编程
En^_^Joy18 小时前
Django项目配置全攻略:settings配置文件
后端·python·django
IT_陈寒20 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
小强库计算机毕业设计20 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
小狼18320 小时前
实践6|SDD 实战:AI 写的规格被推翻了四次
后端·claude
篮框坏了20 小时前
"DeepSeek Harness 实测:一毛钱干三活,但默认配置是个坑"
后端·ai编程
jobBridge2121 小时前
大模型到底是怎么"想"的?我把 Transformer 拆开,发现它其实是个"接词狂魔"
人工智能·后端·编程语言
唐青枫1 天前
看懂内存地址之后,才算真正入门 Zig:指针、切片与实战
后端