线程池种类
ThreadPoolExecutor
基础线程池
线程执行任务过程
- 当前执行线程数 < corePoolSize 直接获取corePoolSize空闲线程执行(没有则创建)
- 当前执行线程数 > corePoolSize && workQueue.offer = true (队列未满) 进入队列
- 当前执行线程数 > corePoolSize && 队列已满 && 当前执行线程数 < maximumPoolSize ,创建线程执行
- 否则执行拒绝策略
线程池配置
名称 | 类型 | 说明 |
---|---|---|
corePoolSize | int | 核心线程数 (最小线程数) |
maximumPoolSize | int | 最大线程数 |
keepAliveTime | long | 非核心线程空闲时间(超出会删除) |
unit | TimeUnit | 非核心线程空闲时间单位 |
workQueue | BlockingQueue<Runnable> | 等待队列 |
threadFactory | ThreadFactory | 创建线程的线程工厂 默认DefaultThreadFactory |
handler | RejectedExecutionHandler | 线程拒绝策略 |
线程拒绝策略什么时候执行
- 线程池被关闭
- 任务队列已满且maximumPoolSizes已满
线程拒绝策略说明
- AbortPolicy 默认策略, 抛出RejectedExecutionException运行时异常
- CallerRunsPolicy 阻塞提交任务的线程
- DiscardPolicy:直接丢弃新提交的任务
- DiscardOldestPolicy:如果执行器没有关闭,队列头的任务将会被丢弃,然后执行器重新尝试执行任务(如果失败,则重复这一过程)
核心方法
submit()
提交任务
ScheduledThreadPoolExecutor 继承 ThreadPoolExecutor
定时器线程池(延时)
与ThreadPoolExecutor 相比,线程池配置有以下区别
- 只能定义corePoolSize
- maximumPoolSize为int最大值
- 不允许有空闲线程(超过corePoolSize的线程在0纳秒后被删除)
- work队列只能是DelayedWorkQueue
核心方法
submit()
提交立即执行的任务
schedule()
提交延时任务
ForkJoinPool
多线程计算线程池,让任务拆分至多个线程(分而治之),最后得到任务的最终结果
线程池配置
名称 | 类型 | 说明 |
---|---|---|
workerNamePrefix ( 不可配置 ) | String | 工作线程池名前缀 |
factory | ForkJoinWorkerThreadFactory | 创建线程的工厂 |
parallelism | int | 同时执行的数量 [1,intMAX - 1 ] |
handler | UncaughtExceptionHandler | 异常处理器 |
mode | boolean | 队列模式 ture FIFO_QUEUE 先进先出, false LIFO_QUEUE 后进先出 |
核心方法
execute()
启动任务,将任务放入工作队列
awaitJoin()
当前任务等待其task的执行
Executors创建线程池
newFixedThreadPool(线程数量,创建工厂) //ThreadPoolExecutor
创建固定大小的线程池
- corePoolSize = maximumPoolSize
- 0毫秒后删除空闲队列
- 可指定ThreadFactory
- 队列为 LinkedBlockingQueue
- 默认拒绝策略
newCachedThreadPool() //ThreadPoolExecutor
创建 corePoolSize 为0 maximumPoolSize 为 intMax的线程池
- corePoolSize = 0
- maximumPoolSize = Integer.MAX_VALUE
- 60s后删除默认线程
- 只能是 DefaultThreadFactory
- 队列为 SynchronousQueue
- 默认拒绝策略
newSingleThreadExecutor() //ThreadPoolExecutor
创建单例线程池
- corePoolSize = 1
- maximumPoolSize = 1
- 0毫秒后删除空闲队列
- 只能是 DefaultThreadFactory
- 队列为 LinkedBlockingQueue
- 默认拒绝策略
newScheduledThreadPool(线程数量,创建工厂) //ScheduledThreadPoolExecutor
创建延时线程池
- 默认拒绝策略
- 可指定ThreadFactory
newSingleThreadScheduledExecutor() // ScheduledThreadPoolExecutor
创建单例延时线程池
- corePoolSize = 1
- 默认拒绝策略
newWorkStealingPool() // ForkJoinPool
创建ForkJoinPool线程池
- 同时执行的数量 = cpu数量
- 线程创建工厂为ForkJoinWorkerThreadFactory
- 没有异常处理器
- 先进先出队列
网友评论