版权声明:转载请注明出处: https://blog.csdn.net/qq_21687635/article/details/84716302
Executor框架
Executor框架结构
- 任务。包括被执行任务需要实现的接口:Runnable接口或Callable接口。
- 任务的执行。任务执行机制的核心接口Executor,以及继承Executor的ExecutorService接口,以及实现了ExecutorService接口的两个关键类:ThreadPoolExecutor和ScheduledThreadPoolExecutor
- 异步计算的结果。包括接口Future和实现Future接口的FutureTask类。
ThreadPoolExecutor
FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
LinkedBlockingQueue是无界队列,使用无界队列会带来如下影响:
- 当线程池的线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池中的线程数不会超过corePoolSize。
- 由于1,使用无界队列时maximumPoolSize将是一个无效参数
- 由于1,使用无界队列时keepAliveTime将是一个无效参数
- 由于使用无界队列,RejectedExecutionHandler将是一个无效参数
SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
SingleThreadExecutor的corePoolSize和maximumPoolSize都被设置为1。其他参数与FixedThreadPool相同。
newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
corePoolSize为0,maximumPoolSize为无界的,keepAliveTime为60秒,工作队列为没有容量的SynchronousQueue。
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来给定的延迟之后运行任务,或者定期执行任务。
FutureTask
FutureTask除了实现Future接口外,还实现了Runnable接口。
FutureTask有3种状态:
- 未启动。FutureTask.run()方法还没被执行之前。
- 已启动。FutureTask.run()方法被执行的过程中。
- 已完成。FutureTask.run()方法执行完成后。
FutureTask的get和cancel的执行图如下:
参考
- Java并发编程的艺术[书籍]