为什么用线程池?解释下线程池参数?

1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。
2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行。
3、提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。

  • corePoolSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程
  • maxinumPoolSize 代表的是最大线程数,它与核心线程数相对应,表示最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完了,还无法满足需求时,此时就会创建新的临时线程,但 是线程池内线程总数不会超过最大线程数
  • keepAliveTime 、 unit 表示超出核心线程数之外的线程的空闲存活时间,也就是核心线程不消除,但是超出核心线程数的部分线程如果空闲一定的时间则会被消除,我们可以通过 setKeepAliveTime 来设置空闲时间
  • workQueue 用来存放待执行的任务,假设我们现在核心线程都已被使用,还有任务进来则全部放入队列,直到整个队列被放满但任务还再持续进入则会开始创建新的线程
  • ThreadFactory
    实际上是一个线程工厂,用来生产线程执行任务。我们可以选择使用默认的创建工厂,产生的线程都在同一个组内,拥有相同的优先级,且都不是守护线程。当然我们也可以选择自定义线程工厂,一般我们会根据业务来制定不同的线程工厂 Handler
  • 任务拒绝策略,有两种情况,第一种是当我们调用 shutdown等方法关闭线程池后,这 时候即使线程池内部还有没执行完的任务正在执行,但是由于线程池已经关闭,我们再继续想线程 池提交任务就会遭到拒绝。另一种情况就是当达到最大线程数,线程池已经没有能力继续处理新提交的任务时,这是也就拒绝

简述线程池处理流程

线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?

1、一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。
阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。
阻塞队列自带阻塞和唤醒的功能,不需要额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活、不至于一直占用cpu资源

2、在创建新线程的时候,是要获取全局锁的,这个时候其它的就得阻塞,影响了整体效率。

线程池中线程复用原理

线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。
在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式只使用固定的线程就将所有任务的 run 方法串联起来。

为什么用线程池?解释下线程池参数?线程池处理流程?阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理?相关推荐

  1. 线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理

    1.一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务.阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使 ...

  2. 线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?

    线程池中阻塞队列的作用: ⼀般的队列只能保证作为⼀个有限⻓度的缓冲区,如果超出了缓冲⻓度,就⽆法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续⼊队的任务. 阻塞队列可以保证任务队列中没有任务 ...

  3. 线程池中阻塞队列的作用?为什么是先添加列队而不是先 创建最大线程?

    1.一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度 ,就无法保留当前的任务 了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务. 阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线 ...

  4. 为什么用线程池?解释下线程池参数? -- Java面试

    为什么用线程池 降低资源消耗.提高线程利用率,降低创建和小回县城的损耗. 提高响应速度.任务来了,直接有线程可用,而不是先创建线程再执行. 提高线程的可管理性.使用线程池可以统一分配调优监控. 解释下 ...

  5. 【无标题】线程池中阻塞队列的作用,为什么是先添加队列而不是先创建最大线程

  6. Java多线程闲聊(四):阻塞队列与线程池原理

    Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...

  7. Java中线程池ThreadPoolExecutor原理探究

    一. 前言 线程池主要解决两个问题:一方面当执行大量异步任务时候线程池能够提供较好的性能,这是因为使用线程池可以使每个任务的调用开销减少(因为线程池线程是可以复用的).另一方面线程池提供了一种资源限制 ...

  8. Java多线程学习八:线程池常用的阻塞队列

    线程池内部结构 线程池的内部结构主要由四部分组成,如图所示. 第一部分是线程池管理器,它主要负责管理线程池的创建.销毁.添加任务等管理操作,它是整个线程池的管家. 第二部分是工作线程,也就是图中的线程 ...

  9. Java线程池和阻塞队列

    一.Java线程池的优点 1.降低资源消耗:通过重复利用线程池中已创建好的线程来降低线程创建和销毁造成的消耗. 2.提高响应速度:当任务到达时,任务可以直接拿到线程池中已创建好的线程立即执行. 3.提 ...

最新文章

  1. java的输出流包括_【转】输入/输出流 - 深入理解Java中的流 (Stream)
  2. SD从零开始19 免费货物
  3. Python模块 - os
  4. [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
  5. Java第十次作业 1502 马 帅
  6. 【华为云技术分享】敏捷实践:一周的Sprint太短,可以调吗
  7. 【Node】新手入门 基于Express,Sequelize、IIS的MVC项目
  8. android恢复联系人,如何从Android手机恢复联系人[最佳方式]
  9. 浅析软件开发项目中的需求分析
  10. OpenCV-通道合并cv::merge
  11. 通信线路工程验收规范 gb51171-2016_一级建造师市政涉及到的相关规范汇总
  12. 高中计算机会考操作试题,高中信息技术会考(上机操作题要点)
  13. 卫星影像去雾与色彩复原
  14. Paddle 印刷电路板(PCB)瑕疵检测
  15. 【零信任落地案例】吉大正元某大型集团公司零信任实践案例
  16. 【深度学习基础知识 - 25】提升模型泛化能力的方法
  17. 北京软件开发商城app系统软件开发大概多少钱
  18. 校验时间段是否与已有时间段存在交叉算法
  19. 5G 流量单价两年降 46% 热议背后,5G 如何解锁商业新模式?
  20. 百度BML飞桨训练营(八)工业计量计读表

热门文章

  1. 【深度学习基础1】深度学习发展历史
  2. 使用C加加实现计算器功能。可以实现加减乘除。需要用到内联。函数重载。new运算符。缺省参数
  3. 信用卡不激活到底会怎样?会有哪些负面影响呢?
  4. 怎么拯救一个不大靠谱的数据库系统 (5 不靠谱的前生)
  5. ear的英语怎么念_ear是什么意思_ear翻译_读音_用法_翻译
  6. 「程序员值得一看」| 传说中的“全球公认最健康的作息时间表”
  7. 操作系统头歌实验四 文件系统
  8. 一文教你用 Neo4j 快速构建明星关系图谱
  9. 常见笔记本CPU型号参数和性能对比一览表
  10. 【SDOI2009】【BZOJ1875】HH去散步