1、什么是线程池?

答:其实说白了,线程池是一种多线程处理方法,帮我们管理线程,避免创建大量的线程增加服务器压力。
其实在面向对象编程中,对象创建和销毁是很费时间的;那么大家就会说,使用线程技术不就好了(ps: 多线程技术主要解决处理器单 元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力),
那么我们举个例子:假设一台服务器完成一项任务的时间为 X
A 创建线程的时间
B 在线程中执行任务的时间,包括线程间同步所需时间
C 线程销毁的时间
X(完成任务的时间)=A+B+C
可以看到A,C是多线程多出的时间,用户希望减少A,C所用的时间,从而减少X的时间,而线程池技术就是缩短这部分时间的技术

2、线程池的原理?

答:创建线程池需要使用 ThreadPoolExecutor 类,它的构造函数参数如下:
ThreadPoolExecutor(int corePoolSize, //核心线程数量 int maximumPoolSize, //最大线程数量 long keepAliveTime, //超出核心线程数量以外的线程空余存活时间 TimeUnit unit, //存活时间的单位 BlockingQueue<Runnable> workQueue, //保存待执行任务的队列 ThreadFactory threadFactory, //创建新线程使用的工厂 RejectedExecutionHandler handler // 当任务无法执行时的处理器 ) {...}
方法如下

``

public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();

int c = ctl.get();
//1.当前池中线程比核心数少,新建一个线程执行任务
if (workerCountOf(c) < corePoolSize) {   if (addWorker(command, true))return;c = ctl.get();
}
//2.核心池已满,但任务队列未满,添加到队列中
if (isRunning(c) && workQueue.offer(command)) {   int recheck = ctl.get();if (! isRunning(recheck) && remove(command))    //如果这时被关闭了,拒绝任务reject(command);else if (workerCountOf(recheck) == 0)    //如果之前的线程已被销毁完,新建一个线程addWorker(null, false);
}
//3.核心池已满,队列已满,试着创建一个新线程
else if (!addWorker(command, false))reject(command);    //如果创建新线程失败了,说明线程池被关闭或者线程池完全满了,拒绝任务

}
``
我们要了解线程池的原理,我们说打比方简单一点
线程比作员工线程池比作一个团队核心池比作团队中核心团队员工数核心池外的线程比作外包员工

  1. 假如团队有了新需求, 先看核心员工数有没有超过最大核心员工数,如果没有超过,就再找一个人进来
  2. 如果最大核心员工已经满名额了,人事不准再进人了,那这个需求只好攒着,放到待完成任务列表吧
  3. 如果待完成任务列表也满了,核心员工根本无法完成这么多任务,就只能再找个外包公司了
  4. 如果核心员工 + 外包员工的数量已经是团队最多能承受人数了,就只能执行handler处理被拒绝的任务。

什么是线程池?(带你初步入门理解线程池)相关推荐

  1. 带你通俗易懂的理解——线程、多线程与线程池

    进程与线程 进程:进程就是正在执行的程序. 线程:是程序执行的一条路径, 一个进程中可以包含多条线程. 通俗理解:例如你打开微信就是打开一个进程,在微信里面和好友视频聊天就是开启了一条线程. 两者之间 ...

  2. java线程自带队列的使用以及线程阻塞

    java线程,设置队列的大小实现队列阻塞 public class QueueThreads {private static int nThreads = 4;//Runtime.getRuntime ...

  3. Thread线程从零认识到深层理解——初识

    线程系列目录 Thread线程从零认识到深层理解--初识 Thread线程从零认识到深层理解--六大状态 Thread线程从零认识到深层理解--wait()与notify() Thread线程从零认识 ...

  4. 一文带你清晰弄明白线程池的原理

    不知道你是否还记得阿里巴巴的java代码规范中对多线程有这样一条强制规范: [强制]线程资源必须通过线程池提供,不允许在程序中显示创建线程. 说明:使用线程池的好处是减少在创建和销毁线程池上所消耗的时 ...

  5. RocketMQ带你快速入门

    1. MQ介绍 ##1.1 为什么要用MQ 消息队列是一种"先进先出"的数据结构 转存失败重新上传取消 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高,容错性就越低.以 ...

  6. Redis快速入门,一篇带你系统入门,学会即加薪

    Redis 1.nosql(非关系型数据库)讲解 为什么要用Nosql 什么是NoSql 了解:大数据时代的3V+3高 2.阿里巴巴架构演进 第五代网站的使命 架构师使命 数据层所遇到的问题以及解决方 ...

  7. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  8. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

  9. C#线程调用带参数的方法 ~

    在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法. 第一种:使用ParameterizedThreadStart. 调用 System.Threading.Thre ...

最新文章

  1. Java:如何更优雅的处理空值?
  2. 玩不转大数据就别勉强了,或许“小数据”才是真正的终南捷径
  3. LeanCloud数据更新不同步问题
  4. Spring Boot实现监控linux-cpu和内存使用情况,并发送邮件
  5. 循环基础-程序计数从0开始
  6. linux7禁用ipv6,RHEL 7 及 CentOS 7 彻底禁用IPv6的方法
  7. jQuery实现两个列表框的值之间的互换:
  8. python画蜡烛致敬烈士_Python量化交易-绘制蜡烛图 !这个图不像你的钱哦!
  9. 【转载】大学生必备软件免费自学视频教程,让那些培训班都见鬼去吧
  10. activiti6中activiti-app教程
  11. 生物信息学简史,A brief history of bioinformatics- Briefings in Bioinformatics综述解读
  12. 华为鸿蒙会没有广告,为什么华为会选择不做任何预告突然发布鸿蒙系统?
  13. 72名图灵奖获得者的成就
  14. 房屋出租系统(第一版)
  15. 2021年3月7日 蚂蚁金服的OceanBase Java后端开发实习面经(一面)
  16. Unity5.3官方VR教程重磅登场-系列6 VR真机测试和产品发布
  17. ref使用之react / react hook
  18. 服务器价格和性能,戴尔PowerEdge R715 性能与价格的平衡
  19. 移动宽带光猫真正后台上网设置
  20. 搜索引擎排名和Page Rank 关联分析

热门文章

  1. Java中子程序输出到输出文件中_Fortran 90中子例程和函数中的参数/变量的INTENT的含义...
  2. rust爱拍视频解说_抖音视频制作必备Mac神器,上热门儿不是事儿
  3. 15复变函数的积分(一)
  4. 【opencv】图像特征与描述
  5. pycharm下的第一个函数程序
  6. mui打包ios_优品视界,聚合影视APP源码。mui框架,hbuilder即可编译,云打包生成ios的Android的app...
  7. 计算机三级上机考试题库,计算机三级数据库上机试题及答案
  8. 变压器符号_变压器规格型号有哪些?这篇文章看完全都了解了
  9. python中stripped string_【Python爬虫学习笔记(3)】Beautiful Soup库相关知识点总结
  10. 组合范畴语法 CCG