Java: 线程池
2021/10/28 9:09:30
本文主要是介绍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,如果线程池没有关闭,则头部的任务将被删除
这篇关于Java: 线程池的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南