当前位置: 首页 > news >正文

内置线程池的核心参数分析配置

ThreadPoolExecutor关键字 包括五个参数 corePoolSize、maximumPool、keepAliveTime、unit、workQueue

corePoolSize表示核心进程数, maximumPool表示最大线程数、workQueue表示阻塞队列中进程数

用一个通俗易懂的例子来理解,core这个核心进程数相当于银行工作窗口,workqueue在排队办理业务的人、max表示能开启总共的总窗口。

core设为5,max设为10(其中包括core的5个 剩余的是临时的),workqueue设为20则 

情况1 来了20个人 会直接去排队 其中的5个人等着核心core处理

情况2 来了25个人 5个人去core办理 剩余20个人把排队的位子坐满

情况3 来了26个人 前25个人和情况2类似 最后到的1个人 直接到临时窗口办理业务

情况4 来了30个人 其中25个人情况处理和情况2类似 剩余的5个人会直接把剩余的5个临时窗口站全了

情况5 来了31个人 那么前三十个人和情况三类似 舍弃最后一个人(线程池的执行策略:拒绝执行)

补充:临时窗口啥时候关闭呢?当所有的窗口都空闲时,并且空闲的时间超过keepAliveTime,那么5个临时窗口会全部关闭,5个core核心窗口保持打开。

代码示例:

public class ThreadPool {//工作进程列表private List<WorkThread> workList = new ArrayList<>();//任务线程private List<Runnable> runnableList = new ArrayList<>();private int coreSize;private int maxSize;private int queueSize;public ThreadPool(int coreSize,int maxSize,int queueSize){this.coreSize = coreSize;this.maxSize = maxSize;this.queueSize = queueSize;//启动任务for(int i = 0; i < coreSize; i++){WorkThread work = new WorkThread(runnableList);new Thread(work).start();workList.add(work);}}public void add(Runnable runnable){synchronized (runnableList){if(runnableList.size() < queueSize){ //核心进程工作//添加并唤醒runnableList.add(runnable);runnableList.notify();}else if(workList.size() < maxSize){ //临时进程工作System.out.println("临时进程启用");WorkThread work = new WorkThread(runnableList);new Thread(work).start();workList.add(work);//让创建的临时进程处理任务runnableList.add(runnable);runnableList.notify();}else{System.out.println("拒绝执行");}}}
}
public class WorkThread implements Runnable{private List<Runnable> runnableList;public WorkThread(List<Runnable> runnableList){this.runnableList = runnableList;}public void run(){Runnable runnable = null;while(true){synchronized (runnableList) {//判断是否为空while (runnableList.isEmpty()) {//执行等待try {runnableList.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}//不空继续执行 取出进程runnable = runnableList.remove(0);}//执行进程代码runnable.run();}}
}
public class Test {public static void main(String[] args){//传值ThreadPool pool = new ThreadPool(5,10,20);for(int i = 0; i < 20; i++){pool.add(new TestWork(i));}}//自定义任务类static class TestWork implements Runnable{private int count;public TestWork(int count){this.count = count;}public void run(){//延时try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + "执行进程: " + count);}}
}

可以调整任务数来观察结果,会完全符合上述的运行逻辑

http://www.dtcms.com/a/511600.html

相关文章:

  • vim及其模式的操作
  • ESP32学习笔记(基于IDF):SmartConfig一键配网
  • 黑马商城day4-微服务02
  • 哪些网站可以找到做海报的素材浙江建设厅考试成绩查询
  • Python定时爬取新闻网站头条:从零到一的自动化实践
  • 纯CSS实现多种背景图案:渐变条纹、蓝图网格、波点与棋盘效果全解析(附 Sass Mixin 封装)
  • Linux相关概念和易错知识点(48)(epoll的底层原理、epoll的工作模式、反应堆模式)
  • 植物网站设计方案如何查网站是哪家公司做的
  • Vue 2 响应式系统常见问题与解决方案(包含_demo以下划线开头命名的变量导致响应式丢失问题)
  • [人工智能-大模型-33]:模型层技术 - 大模型的神经网络架构
  • MySQL 从库延迟 10 小时——磁盘静默错误引发的惨案
  • 【go语言】gopls工具与LSP协议全面解析
  • 网站页面设计怎么做东莞软件开发培训机构
  • 《算法每日一题(1)--- 第31场蓝桥算法挑战赛》
  • 低代码开发平台有哪些:数字化深水区的核心基建与品牌全景
  • 二元 LDPC码的Tanner图表示方法
  • 基于大数据的股票推荐系统 协同过滤推荐算法 数据分析可视化 Django框架 金融数据分析(源码+文档)✅
  • diffusion model(0.4.2) 为什么$\nabla_x \log p(x)$指向概率密度更高的区域?
  • Linux小课堂: 文件归档与压缩技术之从 tar 到 gzip、bzip2 与 zip/rar 详解
  • IT科技资讯新闻类织梦网站模板定制化网站开发
  • 编程 网站建设一站式快速网站排名多少钱
  • 工厂防护鞋穿戴检测预防足部伤害 防护鞋穿戴检测 未佩戴防护鞋实时报警 基于YOLOv8的防护鞋识别算法
  • 「日拱一码」126 机器学习路线
  • react学习笔记【一】
  • Drawnix - 开源白板工具
  • 网站制作是怎么学的WordPress博客右边设置
  • go build -tags的其他用法
  • 【Unity开发】try-finally 与 try-catch 的区别详解
  • PHP数据库操作全攻略
  • 标准解读——GB/T 46353—2025《信息技术 大数据 数据资产价值评估》国家标准