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相关推荐

  1. java模拟而一个电话本操作

    哈哈,大家平时都在使用电话本,下面使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po;/*** * 电话人的信息* */ public cl ...

  2. java制作电话本,java模拟而一个电话本操作

    哈哈.大家平时都在使用电话本.以下使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public ...

  3. java多状态机_一个java状态机样例的代码

    在UML当中有状态机视图,这个状态机可以用于自动售货机,自动售票机等等场景,下面是用java代码模拟的一个状态机: 1.状态机接口 package stateMachine; /** * 状态机接口 ...

  4. Java代码模拟Redis

    Redis是C语言编写的NoSQL 存储形式是K->V 可以搭建集群(健壮) 相比memcached一个key对应的value最大只能存储1M而言Redis则十分慷慨可以支持1G(如果你内存足够 ...

  5. JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...

    用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...

  6. java 12306 模拟登陆_请教java尝试模拟登录12306时遇到的一个问题

    展开全部 首先12306网站前32313133353236313431303231363533e78988e69d8331333363386133缀为"https://" 表明是用 ...

  7. Java代码模拟一个Post请求

    Java代码模拟一个Post请求 ​ 我们常用的http请求无非GET和POST.在springboot项目中,我们如果想要测试一段代码无非就是项目跑起来,然后在浏览器中通过输入url,看浏览器中(按 ...

  8. java存款程序_ATM 用java语言做的一个模拟ATM机的程序。可支持取款存款等操作 Develop 238万源代码下载- www.pudn.com...

    文件名称: ATM下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 865 KB 上传时间: 2015-04-13 下载次数: 0 提 供 者: 葛宏涛 详细说明: ...

  9. java钢琴键_javapiano Java Piano模拟钢琴效果的完整源码 联合开发网 - pudn.com

    javapiano 所属分类:Java编程 开发工具:Java 文件大小:32KB 下载次数:10 上传日期:2014-04-15 21:09:50 上 传 者:王小强 说明:  Java Piano ...

最新文章

  1. 域 和 Session 的问题
  2. 如何为SFP光模块搭配对应的光纤跳线?
  3. shell在二级python_在Shell脚本中检查Python版本的方法
  4. zabbix mysql 8g优化_zabbix mysql调优
  5. np.meshgrid
  6. 阿里云Centos系统使用密钥对登陆
  7. antd design form表单手动处理错误
  8. BEGIN-1 A+B问题
  9. 15-07-10 结构体-输入学生成绩进行排序
  10. 2016年2月工作日志
  11. 高达100亿美元!美国国防部将IBM和甲骨文双双踢出了云计算合同;华为任正非说了,华为对向苹果等对手出售5G芯片保持开放的态度...
  12. 苹果如何分屏_刚刚,苹果证实,iPhone12 刘海没了!
  13. 关于忘记MySQL的root用户密码的问题
  14. 各国货币代码表(Currency Code)
  15. CPC客户端编写新申请时报错异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
  16. tp 框架防sql注入
  17. 华为计算机怎么算根号,华为手机计算器的根号是什?
  18. 我在舒舍的短租生活之旅
  19. linux tc工具,Linux TC软件系统损坏自助恢复的工具.TC刷机,TC修复,TCPUP,TCP-UP
  20. linux内核编译及config配置

热门文章

  1. 国家邮政局:9月份全国快递服务企业业务收入完成921.4亿元,同比增长11.8%
  2. 字节跳动将推出汽车云业务,计划2025年追赶腾讯
  3. 一加9系列全网预约量破200万:3月24日见!
  4. 罗永浩最期待的游戏要来了 《Party Animals》10月上线
  5. 苹果官方首次松口:新款iPhone SE有望近期亮相
  6. 女子将车垂直开上标志杆,警方回应...
  7. vivo NEX 3 5G真机曝光:瀑布屏+升降镜头
  8. 章泽天将赴英国剑桥大学读书?证件照都是这么能打...
  9. 小米第二款5G手机是小米9?升级版小米9 配置强悍!
  10. 华为Mate 20 X 5G版本月起全球开卖:国内上市的首款5G手机