【java】java 模拟 实现一个 ThreadPoolExecutor
1.概述
这里参考:
硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理
面经手册 · 第21篇《手写线程池,对照学习ThreadPoolExecutor线程池实现原理!》
这里先参考ThreadPoolExecutor的实现并且进行简化,实现一个只有核心线程的线程池,要求如下:
- 暂时不考虑任务执行异常情况下的处理。
- 任务队列为无界队列。
- 线程池容量固定为核心线程数量。
- 暂时不考虑拒绝策略。
public class ThreadPoolTrader implements Executor {private final AtomicInteger ctl = new AtomicInteger(0);private volatile int corePoolSize;private volatile int maximumPoolSize;private final BlockingQueue<Runnable> workQueue;public ThreadPoolTrader(int corePoolSize, int maximumPoolSize, BlockingQueue<Runnable> workQueue) {this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;}@Overridepublic void execute(Runnable command) {int c = ctl.get();if (c < corePoolSize) {if (!addWorker(command)) {reject();}return;}if (!workQueue.offer(command)) {if (!addWorker(command)) {reject();}}}private boolean addWorker(Runnable firstTask) {if (ctl.get() >= maximumPoolSize) return false;Worker worker = new Worker(firstTask);worker.thread.start();ctl.incrementAndGet();return true;}private final class Worker implements Runnable {final Thread thread;Runnable firstTask;public Worker(Runnable firstTask) {this.thread = new Thread(this);this.firstTask = firstTask;}@Overridepublic void run() {Runnable task = firstTask;try {while (task != null || (task = getTask()) != null) {task.run();if (ctl.get() > maximumPoolSize) {break;}task = null;}} finally {ctl.decrementAndGet();}}private Runnable getTask() {for (; ; ) {try {System.out.println("workQueue.size:" + workQueue.size());return workQueue.take();} catch (InterruptedException e) {e.printStackTrace();}}}}private void reject() {throw new RuntimeException("Error!ctl.count:" + ctl.get() + " workQueue.size:" + workQueue.size());}public static void main(String[] args) {ThreadPoolTrader threadPoolTrader = new ThreadPoolTrader(2, 2, new ArrayBlockingQueue<Runnable>(10));for (int i = 0; i < 10; i++) {int finalI = i;threadPoolTrader.execute(() -> {try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("任务编号:" + finalI);});}}}// 测试结果任务编号:1
任务编号:0
workQueue.size:8
workQueue.size:8
任务编号:3
workQueue.size:6
任务编号:2
workQueue.size:5
任务编号:5
workQueue.size:4
任务编号:4
workQueue.size:3
任务编号:7
workQueue.size:2
任务编号:6
workQueue.size:1
任务编号:8
任务编号:9
workQueue.size:0
workQueue.size:0
以上,关于线程池的实现还是非常简单的,从测试结果上已经可以把最核心的池化思想体现出来了。主要功能逻辑包括:
ctl
,用于记录线程池中线程数量。corePoolSize
、maximumPoolSize,用于限制线程池容量。workQueue
,线程池队列,也就是那些还不能被及时运行的线程,会被装入到这个队列中。execute
,用于提交线程,这个是通用的接口方法。在这个方法里主要实现的就是,当前提交的线程是加入到worker、队列还是放弃。addWorker
,主要是类 Worker 的具体操作,创建并执行线程。这里还包括了 getTask() 方法,也就是从队列中不断的获取未被执行的线程。
好,那么以上呢,就是这个简单线程池实现的具体体现。但如果深思熟虑就会发现这里需要很多完善,比如:线程池状态呢,不可能一直奔跑呀!?、线程池的锁呢,不会有并发问题吗?、线程池拒绝后的策略呢?,这些问题都没有在主流程解决,也正因为没有这些流程,所以上面的代码才更容易理解。
接下来,我们就开始分析线程池的源码,与我们实现的简单线程池参考对比,会更加容易理解
【java】java 模拟 实现一个 ThreadPoolExecutor相关推荐
- java模拟而一个电话本操作
哈哈,大家平时都在使用电话本,下面使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po;/*** * 电话人的信息* */ public cl ...
- java制作电话本,java模拟而一个电话本操作
哈哈.大家平时都在使用电话本.以下使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public ...
- java多状态机_一个java状态机样例的代码
在UML当中有状态机视图,这个状态机可以用于自动售货机,自动售票机等等场景,下面是用java代码模拟的一个状态机: 1.状态机接口 package stateMachine; /** * 状态机接口 ...
- Java代码模拟Redis
Redis是C语言编写的NoSQL 存储形式是K->V 可以搭建集群(健壮) 相比memcached一个key对应的value最大只能存储1M而言Redis则十分慷慨可以支持1G(如果你内存足够 ...
- JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...
用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...
- java 12306 模拟登陆_请教java尝试模拟登录12306时遇到的一个问题
展开全部 首先12306网站前32313133353236313431303231363533e78988e69d8331333363386133缀为"https://" 表明是用 ...
- Java代码模拟一个Post请求
Java代码模拟一个Post请求 我们常用的http请求无非GET和POST.在springboot项目中,我们如果想要测试一段代码无非就是项目跑起来,然后在浏览器中通过输入url,看浏览器中(按 ...
- java存款程序_ATM 用java语言做的一个模拟ATM机的程序。可支持取款存款等操作 Develop 238万源代码下载- www.pudn.com...
文件名称: ATM下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 865 KB 上传时间: 2015-04-13 下载次数: 0 提 供 者: 葛宏涛 详细说明: ...
- java钢琴键_javapiano Java Piano模拟钢琴效果的完整源码 联合开发网 - pudn.com
javapiano 所属分类:Java编程 开发工具:Java 文件大小:32KB 下载次数:10 上传日期:2014-04-15 21:09:50 上 传 者:王小强 说明: Java Piano ...
最新文章
- 域 和 Session 的问题
- 如何为SFP光模块搭配对应的光纤跳线?
- shell在二级python_在Shell脚本中检查Python版本的方法
- zabbix mysql 8g优化_zabbix mysql调优
- np.meshgrid
- 阿里云Centos系统使用密钥对登陆
- antd design form表单手动处理错误
- BEGIN-1 A+B问题
- 15-07-10 结构体-输入学生成绩进行排序
- 2016年2月工作日志
- 高达100亿美元!美国国防部将IBM和甲骨文双双踢出了云计算合同;华为任正非说了,华为对向苹果等对手出售5G芯片保持开放的态度...
- 苹果如何分屏_刚刚,苹果证实,iPhone12 刘海没了!
- 关于忘记MySQL的root用户密码的问题
- 各国货币代码表(Currency Code)
- CPC客户端编写新申请时报错异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
- tp 框架防sql注入
- 华为计算机怎么算根号,华为手机计算器的根号是什?
- 我在舒舍的短租生活之旅
- linux tc工具,Linux TC软件系统损坏自助恢复的工具.TC刷机,TC修复,TCPUP,TCP-UP
- linux内核编译及config配置
热门文章
- 国家邮政局:9月份全国快递服务企业业务收入完成921.4亿元,同比增长11.8%
- 字节跳动将推出汽车云业务,计划2025年追赶腾讯
- 一加9系列全网预约量破200万:3月24日见!
- 罗永浩最期待的游戏要来了 《Party Animals》10月上线
- 苹果官方首次松口:新款iPhone SE有望近期亮相
- 女子将车垂直开上标志杆,警方回应...
- vivo NEX 3 5G真机曝光:瀑布屏+升降镜头
- 章泽天将赴英国剑桥大学读书?证件照都是这么能打...
- 小米第二款5G手机是小米9?升级版小米9 配置强悍!
- 华为Mate 20 X 5G版本月起全球开卖:国内上市的首款5G手机