JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列
技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
上面是线程的执行周期
这个线程的生命周期,可以看到时间都浪费在了创建和销毁的这里了.
实际上执行业务的时间只有1s
在高并发的时候,如果持续的去,创建,销毁,那么是很浪费时间的
这个时候就需要用线程池
用了线程池以后,线程的创建用的3秒,销毁用的2秒就没有了,
只剩运行时间用的1s了.
比如有100个任务要执行,那么我们的线程池是10个线程,
那么也就是说,线程池已经准备好10个线程去用了,
这10个线程同时去执行10个任务,那么剩余的90个任务,因为咱们用的是阻塞队列
所以剩余的90个任务就会阻塞等待执行.
可以看一下这个线程队列的工作过程,
首先,这里
ThreadPoolExecutor t=new ThreadPoolExecutor(1,3,0,TimeUnit.MILISECONDS,new LinkedBlockingDeque<Runnable>(3));
这里1,是核心线程数,就是在线程池中活动的线程数,然后3是最大线程数,也就是可以开启的最大线程数,
然后0是超时时间,后面是这个超时时间的单位,这个超时时间的意思是,除了核心线程,我另外创建的线程,如果没有任务添加进来的话,那么线程需要等多久
被销毁掉,然后后面的new LinkedBlockingDeque<Runnable>(3)是一个阻塞队列.
3是队列的大小,这里如果队列的大小,不填写的话,那么,默认就是Integer.MAX_VALUE这个数
2147483647 21亿多
然后再看一下这个线程池队列的工作过程:
比如一个任务来了,因为一个任务就等于一个线程,那么就要先判断,是否现在正在工作的线程个数,大于核心线程数(已经创建好的可以用的线程数)了,
如果没有大于核心线程数,那么就从就绪的线程中拿一个,去执行任务就可以了,如果大于了核心线程数,那么,再去判断,
任务放在队列中,这个队列的大小满了没,比如说3个,队列中的任务大于3个了嘛,没有大于3个,就把这个任务继续放到这个
队列中去,然后等待,正在执行的线程,用完了以后空闲下来,再去执行队列里面的任务,如果
任务往队列中放的时候,发现队列已经满了,那么这个时候,就可以创建新线程来执行任务,这个时候再做个判断,
如果创建的新线程数量+核心线程数量<=最大线程数的时候,那么就利用新创建的线程和核心线程来分摊任务,
如果新线程数量+核心线程数量>最大线程数量的话,那么,这个时候程序就会报错,这个在实际应用中我们发生过,
就会拒绝这个任务的加入.
这个超时时间的意思是,当队列中的任务已经满了,并且核心线程也都在用着,那么我去创建新线程,
那么,我创建的这个新的线程,执行完这个队列中溢出的任务以后,这个线程不会立刻销毁,我们这个线程
需要等等看,还有没有新线程,如果有的话我就继续执行去,如果没有我就等等,等多久销毁,这里是指定的这个时间.
接下来用代码,弄一下上面的过程:
这里创建一个线程池,指定,核心线程数1,最大线程数2,新创建线程超时时间3,秒,然后用阻塞队列,队列大小是3
这里我执行一个任务,注意用完线程池,要关闭
这个时候核心线程,在执行这个任务,然后
这个时候队列中是空的,因为一个线程已经从队列中取出,正在执行
那么我又放了3个任务,这个时候,队列正好是满的了
可以看到这里,打印出了4个,都是用第一个线程执行的.
因为第一个线程正在执行第一个任务,然后第2,3,4个任务正好在队列中,
队列还能容得下,所以也没有创建新线程.
然后如果我再添加一个任务,那么就是,
第一个核心线程正在执行第一个任务,然后第2,3,4个任务在队列中,然后如果这个时候,再来一个任务
第5个任务,这个时候队列中也不能放了,这个时候,就会
再创建一个新线程来执行,咱们看看
可以看到第5个任务是用thread2来执行的.
然后再执行可以看到,有几个任务是用thread2来执行的,这个就是说,咱们上面说的
核心线程会和新创建的线程分摊这任务,所以只要是谁有时间谁就去执行这个任务.
那么如果,咱们再去添加任务呢?
可以看到,第一个核心线程去执行第一个任务
然后,第2,3,4个任务放在容量为3个阻塞队列里,然后
第5个任务来的时候,阻塞队列容量不够了会新创建一个线程去执行,
然后第6个任务来的时候,因为咱们最大线程数设置的是2,现在已经是2个线程了,所以这个时候
就会拒绝服务,报错了.
这个就是线程池的应用.
JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列相关推荐
- JAVA线程池_并发队列工作笔记0004---Callable原理_多线程执行Callable任务
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 注意之前咱们说的线程池队列中都是用的实现了Runnbale接口的线程, 这里咱们用的是实现了Cal ...
- JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里说线程池的分类 有可缓存类型, 定长类型, 定时类型, 单例类型, 这里我这次用Executo ...
- java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)
对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一个程序 ...
- java boolean 包_java Boolean包装类工作笔记
本文章为各位介绍一篇关于java Boolean包装类工作笔记,希望这篇文章能够帮助到各位同学,有兴趣的朋友可以进来看看吧. 题目:问下列代码运行结果是什么? 代码如下 复制代码 package q ...
- C#.Net工作笔记006---关于各种四舍五入_小数点保留第几位等操作_随时更新
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 今天做项目,各种切小数点,金融中可能用的不是4舍5入,可能是4舍6入5成双. 1.关于截取小数点第 ...
- JAVA线程池_并发队列工作笔记0001---认识阻塞队列_非阻塞队列
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 注意这个ConcurrentLinkedQueue这个是个非阻塞队列, 这个队列是没有长度限制的, ...
- JAVA高并发服务器工作笔记0001---Java中InetAddress与InetSocketAddress的基本用法
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 一.InetAddress:类的主要作用是封装IP及DNS,因为这个类没有构造器,所以我们要用他的 ...
- nginx工作笔记005---nginx配置负载均衡_在微服务中实现网关集群_实现TCP传输层协议__http协议的负载均衡
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 我们在微服务中,由于网关的存在,后来,在nginx中都不需要在配置其他服务的地址了,只需要,配置一 ...
- K8S_Google工作笔记0011---通过二进制方式_部署etcd集群
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上一步咱们生成了,这4个证书文件,ca-key.pem ca.pem server-key.pem ...
最新文章
- MySql配置方法,批处理进行MySql配置
- 第十六届无线节能信标灯规格说明
- 打响汽车信息安全战,百度Apollo构建最高等级安全防护盾牌
- linux系统优化思路
- 是vans_Vans 的旧海报上原来有这么多学问…
- MFC工作笔记0003---WindowsAPI与MFC的关系
- php数组排序不要用函数,PHP数组排序函数使用方法
- Hadoop1.0之集群搭建
- Java入门——第九天
- 银行软件测试项目管理中存在的问题及解决的对策
- gp数据库与pg数据库
- FreeSwitch uuid_bridge代码分析
- 计算机专业对环境保护,计算机与环境保护
- 18岁创业从哪入手?读透这5点则事半功倍!
- 古之成大事者必经三境界--王国维《人间词话》
- 【问链财经-区块链基础知识系列】 第四十四课 邮储银行:U链福费廷业务系统
- matlab调和级数求和,科学网—疯狂的绝技------级数加速收敛的艺术 - 张江敏的博文...
- 如何在鼠标右键菜单中添加自定义菜单?工效率提升一倍
- MFC字体磅数与像素CImage
- Python爬虫学习(四)爬取图片素材网站素材
热门文章
- mysql相互密码_去掉mysql命令行密码不安全的提示
- springboot 设置默认访问index.html_【SpringBoot WEB系列】WebFlux静态资源配置与访问
- STM32单片机一个定时器输出不同频率PWM波
- leetcode刷题——415. 字符串相加
- voc数据集的map计算方式
- 为什么8位二进制的取值范围是-128~127
- 个人对stacking的思想理解
- 慕课网上的星级评分--学习视频后模仿实现
- sql order by 结合case when then
- Andrid Floating Action Button