核心组成
-
corePoolSize:指定了线程池中的线程数量。
-
maximumPoolSize:指定了线程池中的最大线程数量。
-
keepAliveTime:当前线程池数量超过 corePoolSize 时,多余的空闲线程的存活时间,即多次时间内会被销毁。
-
unit:keepAliveTime 的单位。
-
workQueue:任务队列,被提交但尚未被执行的任务。
-
threadFactory:线程工厂,用于创建线程,一般用默认的即可。
-
handler:拒绝策略,当任务太多来不及处理,如何拒绝任务。
运作机制
- 判断线程数是否大于核心线程数,如果不是,创建线程执行任务
- 判断队列是否已满,如果不是,任务进入队列等待
- 判断线程数是否大于最大线程数,如果不是,创建线程执行任务
- 执行拒绝策略
拒绝策略
策略名称 | 含义 |
---|---|
AbortPolicy(默认) | 直接抛出异常,阻止系统正常运行 |
DiscardPolicy | 该策略默默地丢弃无法处理的任务,不予任何处理 |
DiscardOldestPolicy | 丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。 |
CallerRunsPolicy | 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务 |
队列
线程池主要用到的阻塞队列是前四个
名称 | 特点 |
---|---|
ArrayBlockingQueue | 用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。默认情况下 |
LinkedBlockingQueue | 基于链表的阻塞队列,同 ArrayListBlockingQueue 类似,此队列按照先进先出(FIFO)的原则对元素进行排序 |
PriorityBlockingQueu | 是一个支持优先级的无界队列。默认情况下元素采取自然顺序升序排列。可以自定义实现compareTo()方法来指定元素进行排序规则,或者初始化PriorityBlockingQueue 时,指定构造参数 Comparator 来对元素进行排序。需要注意的是不能保证同优先级元素的顺序。 |
DelayQueue | 是一个支持延时获取元素的无界阻塞队列。队列使用 PriorityQueue 来实现 |
SynchronousQueue | 是一个不存储元素的阻塞队列。每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素。 |
LinkedTransferQueue | 是 一 个 由 链 表 结 构 组 成 的 无 界 阻 塞 TransferQueue 队 列 |
LinkedBlockingDeque | 是一个由链表结构组成的双向阻塞队列 |
设置线程参数
CPU密集型任务应当配置尽可能小的线程,如配置N(cpu)+1个线程的线程池
IO密集型的配置尽可能多的线程,如2*N(cpu)