JUC线程池架构
JUC是java.util.concurrent工具包的简称,从JDK1.5加入,用于处理高并发和多线程
Executor
函数式接口,只有一个方法void execute(Runnable command)
异步目标任务的执行者接口
ExecutorService
继承自Executor
接受异步任务并转交给执行者
Executors
静态工厂类,提供快捷创建线程池的方法
AbstractExectorService
为ExecutorService
中的接口提供默认实现
ThreadPollExector
“线程池”实现类,是JUC中线程池的核心实现类
ScheduledExecutorService
完成“延时”和“周期性”任务的调度线程池接口
ScheduledThreadPoolExector
继承 ThreadPollExector
并 实现 ScheduledExecutorService
提供完成“延时”和“周期性”任务的调度的默认实现
Executors
快捷创建线程4种方法
Executors
快捷创建线程「方便但不建议使用」
newSingleThreadExecutor
创建 「单线程化线程池」
- 问题:无界队列(OOM)
LinkedBlockingQueue
- FIFO
- 池中唯一线程存活时间无限
- 新来的任务在线程池忙时阻塞
newFixedThreadPool
创建 「固定数量的线程池」
- 问题:无界队列(OOM)
LinkedBlockingQueue
- 线程数没达到固定数量,新来的任务每次都分配一个线程
- 达到数量,新来的任务加入阻塞队列
- 达到数量,因为任务异常死亡时,补充一个新线程
newCachedThreadPool
创建 「可缓存线程池」
- 问题:最大线程数量不设上限(OOM,CPU资源耗尽)
SynchronousQueue
- 新来一个任务,线程池中所有线程繁忙,新建线程处理新到任务
- 若部分线程空闲超过一定时间,回收该线程
newScheduledThreadPool
创建 「可调度线程池」
- 问题:最大线程数量不设上限(OOM,CPU资源耗尽)
DelayQueue
- 被调任务执行时间大于指定的时间间隔时,不会新建线程而是等待前一次调度执行完毕
ThreadPoolExecutor
线程池
线程池的标准创建方式
使用 ThreadPoolExecutor
类
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
)
复制代码
向线程池提交任务的两种方式
execute
void execute(Runnable command)
- 接受参数类型为
Runnable
- 无返回值
submit
Future<?> submit(Runnable task)
<T> Future<T> submit(Runnable task, T result)
<T> Future<T> submit(Callable<T> task)
- 参数类型可以为
Runnable
或Callable
- 返回值为
Future
对象 - 最终调用的还是
execute()
方法
调度方式
只有在核心线程已满,阻塞队列已满,才会创建新线程
ThreadFactory
线程工厂
ThreadFactory
线程工厂用于创建线程,而上述的Executors
线程池工厂用于创建线程池
BlockingQueue
ArrayBlockingQueue
- 创建时必需设置大小
- FIFO
LinkedBlockingQueue
- 可以设置大小
- 不设置大小默认为无界队列
- 吞吐量高于
ArrayBlockingQueue
- Executors.newSingalThreadExecutor
- Executors.newFixedThreadPool
PriorityBlockingQueue
- 具有优先级的无界队列
DelayQueue
- 基于
PriorityBlockingQueue
- 每个元素具有过期时间
- 只有已经的元素才会出队,队头是最快过期的元素
- Executors.newScheduledThreadPool
SynchronousQueue
- 同步队列
- 不存储元素的队列
- 每个插入操作必须等待另一个线程的移出操作
- Executors.newCachedThreadPool
钩子方法
-
前钩子
-
后钩子
-
停止钩子