技术交流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---认识线程池_在线程池中使用队列相关推荐

  1. JAVA线程池_并发队列工作笔记0004---Callable原理_多线程执行Callable任务

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 注意之前咱们说的线程池队列中都是用的实现了Runnbale接口的线程, 这里咱们用的是实现了Cal ...

  2. JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里说线程池的分类 有可缓存类型, 定长类型, 定时类型, 单例类型, 这里我这次用Executo ...

  3. java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)

    对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一个程序 ...

  4. java boolean 包_java Boolean包装类工作笔记

    本文章为各位介绍一篇关于java Boolean包装类工作笔记,希望这篇文章能够帮助到各位同学,有兴趣的朋友可以进来看看吧. 题目:问下列代码运行结果是什么?  代码如下 复制代码 package q ...

  5. C#.Net工作笔记006---关于各种四舍五入_小数点保留第几位等操作_随时更新

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 今天做项目,各种切小数点,金融中可能用的不是4舍5入,可能是4舍6入5成双. 1.关于截取小数点第 ...

  6. JAVA线程池_并发队列工作笔记0001---认识阻塞队列_非阻塞队列

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 注意这个ConcurrentLinkedQueue这个是个非阻塞队列, 这个队列是没有长度限制的, ...

  7. JAVA高并发服务器工作笔记0001---Java中InetAddress与InetSocketAddress的基本用法

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 一.InetAddress:类的主要作用是封装IP及DNS,因为这个类没有构造器,所以我们要用他的 ...

  8. nginx工作笔记005---nginx配置负载均衡_在微服务中实现网关集群_实现TCP传输层协议__http协议的负载均衡

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 我们在微服务中,由于网关的存在,后来,在nginx中都不需要在配置其他服务的地址了,只需要,配置一 ...

  9. K8S_Google工作笔记0011---通过二进制方式_部署etcd集群

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上一步咱们生成了,这4个证书文件,ca-key.pem ca.pem server-key.pem ...

最新文章

  1. MySql配置方法,批处理进行MySql配置
  2. 第十六届无线节能信标灯规格说明
  3. 打响汽车信息安全战,百度Apollo构建最高等级安全防护盾牌
  4. linux系统优化思路
  5. 是vans_Vans 的旧海报上原来有这么多学问…
  6. MFC工作笔记0003---WindowsAPI与MFC的关系
  7. php数组排序不要用函数,PHP数组排序函数使用方法
  8. Hadoop1.0之集群搭建
  9. Java入门——第九天
  10. 银行软件测试项目管理中存在的问题及解决的对策
  11. gp数据库与pg数据库
  12. FreeSwitch uuid_bridge代码分析
  13. 计算机专业对环境保护,计算机与环境保护
  14. 18岁创业从哪入手?读透这5点则事半功倍!
  15. 古之成大事者必经三境界--王国维《人间词话》
  16. 【问链财经-区块链基础知识系列】 第四十四课 邮储银行:U链福费廷业务系统
  17. matlab调和级数求和,科学网—疯狂的绝技------级数加速收敛的艺术 - 张江敏的博文...
  18. 如何在鼠标右键菜单中添加自定义菜单?工效率提升一倍
  19. MFC字体磅数与像素CImage
  20. Python爬虫学习(四)爬取图片素材网站素材

热门文章

  1. mysql相互密码_去掉mysql命令行密码不安全的提示
  2. springboot 设置默认访问index.html_【SpringBoot WEB系列】WebFlux静态资源配置与访问
  3. STM32单片机一个定时器输出不同频率PWM波
  4. leetcode刷题——415. 字符串相加
  5. voc数据集的map计算方式
  6. 为什么8位二进制的取值范围是-128~127
  7. 个人对stacking的思想理解
  8. 慕课网上的星级评分--学习视频后模仿实现
  9. sql order by 结合case when then
  10. Andrid Floating Action Button