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

相关推荐
mldong2 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
爱学堂IT分享4 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
王的宝库5 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
码事漫谈6 小时前
类型即世界:一个 C++ 程序员的本体论入门
后端
Rain的Java大神之路6 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
IT_陈寒8 小时前
Python的多线程居然是个假把式?搞清GIL让我少熬三天夜
前端·人工智能·后端
明月_清风8 小时前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
明月_清风8 小时前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法
考虑考虑8 小时前
ElasticSearch索引命令
运维·后端·elasticsearch
玉宇夕落10 小时前
背单词项目一:融会贯通:从零构建"单词大师"后台——Next.js + Supabase + Drizzle 全栈开发实战
后端