栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java: 线程池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java: 线程池

文章目录
  • 核心线程core数量和最大线程max数量
  • 线程启动时机
  • 存活时间
  • 队列
    • 三种队列模式
      • 直接交接
      • 无限队列
      • 有限队列
  • 任务被拒绝

核心线程core数量和最大线程max数量

线程池根据core和max自动调整线程数量。当小于core时,即使其他线程空闲,添加新任务也会新建线程。当线程数量在core和max之间时,只有当队列满时,才会新建线程。
设置core = max将会得到一个固定数量的线程池。当设置max为无限大时,相当于允许线程池自适应执行并发任务的数量。

线程启动时机

默认执行任务时创建,可以通过调用prestartCoreThread()和prestartAllCoreThreads()方法提前创建。

存活时间

当线程数量超过core,超过存活时间的闲置线程将被结束。默认不会结束核心线程,但是可以通过设置允许结束核心线程,使存活时间对核心线程生效

队列

BlockingQueue用于转移和放置任务:
1、如果线程数量小于核心数量,任务会跳过队列直接被执行
2、如果超过核心线程数量的任务在执行,任务将被放入队列而不是创建新线程
3、如果任务无法放入队列,将会创建新线程。但是线程数量超过最大值时,任务将被拒绝。

三种队列模式 直接交接

SynchronousQueue直接将任务交给线程,不会持有任务。为防止没有线程立即执行任务导致任务失败,会马上创建一个新线程。为避免任务失败,这种模式一般要求max数量无限大

无限队列

使用无限队列(例如linkedBlockingQueue),可以在核心线程繁忙时,将任务添加到队列中。因此,不会有超过core数量的线程被创建,max将无效。

有限队列

有限队列和指定max数量的线程池搭配,可以限制资源耗尽,同时也难以控制。
队列和线程数量相互制约:
大队列和小线程池,会导致吞吐量小;小队列大线程池,cpu将会繁忙,同样会导致吞吐量小

任务被拒绝

当线程池关闭或者队列和线程数量都装满时,提交任务将会失败。可以通过RejectedExecutionHandler监听。系统提供了四种预置的方法:
1、 ThreadPoolExecutor.AbortPolicy, 默认策略是抛出异常** RejectedExecutionException **
2、ThreadPoolExecutor.CallerRunsPolicy,调用execute本身的线程执行任务,将降低新任务提交的速度
3、ThreadPoolExecutor.DiscardPolicy,简单删除无法执行的任务
4、ThreadPoolExecutor.DiscardOldestPolicy,如果线程池没有关闭,则头部的任务将被删除

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/354171.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号