本文主要介绍了java 中的线程池。
线程池的好处:
(1)降低资源的消耗:利用已创建的线程降低创建和销毁的消耗
(2)提高响应时间,建立在(1) 的基础上
(3)提高线程的可管理性线程池工作流程 :
提交一个新的任务之后
(1) 判断核心线程池里面是否都在执行任务,一种情况是线程池刚启动,里面的核心线程还没有达到预设的数量,则创建核心线程池,并把任务提交给核心线程执行,还有一种情况是,核心线程池里面有核心线程当前处于闲置状态,则提交任务给其运行,上述两种情况都不满足的情况下,则核心线程池已满,处于运行状态。进入下一步判断
(2)判断队列是否已满,如果没满,则任务进入工作队列,否则进入下一步。
(3) 判断线程池是否都已经处于工作状态,如果都是,则交给饱和策略,否则创建新线程执行任务。
- 执行示意图 :
4.线程池关键点介绍
阻塞队列部分介绍:
(1) BlockingQueue:
ArrayBlockingQueue: 基于数组,先进先出排序。
LinkedBlockingQueue:基于队列。
SynchronizedQueue:不存储元素的阻塞队列,每一个插入操作必须等待另外一个线程移除操作,否者插入操作一直处于阻塞状态。
PriorityBlockingQueue:具有优先级。
(2) RejectExecutionHandler :
AbortPolicy: 直接跑出异常
DiscardPolicy:不处理丢掉
CallerRunsPolicy:只用调用者所在的线程来运行任务。
DiscardOldestPolicy: 丢弃队列中最近的一个任务,并执行当前任务。
(3) 提交方式:
submit() : 提交有返回值的任务
excute() : 提交没有返回值得任务
(4) 关闭线程池:
shutdown(): 将状态设置成shutdown 状态,中断所有没有正在执行任务的线程。
shutdownNow():将状态设置成STOP状态,并且尝试停止所有的线程,并返回等待执行任务的列表。
(5)如何合理分配线程池线程数量:
N 代表CPU
IO密集型:线程数为 N * 2
CPU 密集型:N+1
混合型:尽可能地拆分乘CPU密集型和IO密集型。
有时候还需要关注 任务的优先级以及 是否依赖于其他的系统资源。
(6) 线程池监控。
taskCount: 线程池中运行任务的数量。
completedTaskCount : 运行过程中已完成的任务数量。
等等。