10. Executor框架
Executor框架大致分为三部分:
- 任务:Runnable、Callable这两个接口
- 任务执行:核心接口Executor、继承于Executor的ExecutorService、两个实现ExecutorService接口的实现类(ThreadPoolExecutor和ScheduledThreadPoolExecutor)
- 异步计算的结果:Future接口、Future接口的实现类FutureTask
Executor框架主要包含的类和接口
- Executor:基本接口,将任务的提交和任务的执行分隔开
- ThreadPoolExecutor:线程池的核心实现类,用来执行被提交的任务
- ScheduledThreadPoolExecutor:实现类,可以在给定的延迟后执行命令,或者定时任务
- Future、FutureTask:异步计算结果
- Runnable、Callable:都可以被ThreadPoolExecutor、ScheduledThreadPoolExecuto执行
1. ThreadPoolExecutor线程池
-
FixedThreadPool:可重用固定线程数的线程池
- 临时线程执行完任务后,就会被终止
- 使用LinkedBlockingQueue无界阻塞队列,所以基本上不会使用拒绝策略
- 采用的是固定线程数
-
SingleThreadlExecutor:单个Worker线程的Executor
- 核心线程数和固定线程数均为1
- 和ThreadPoolExecutor使用的一样,都是LinkedBlockingQueue无界阻塞队列
-
CachedThreadPool:
- 核心线程数为0,最大线程数为Integer.MAX_VALUE
- 线程存活时间为60秒
- 使用的是SynchronousQueue作为工作队列
2. ScheduledThreadPoolExecutor线程池
-
ScheduledThreadPool:
- 使用DelayQueue作为任务队列,DelayQueue中封装了一个PriorityQueue,排序时time时间短的在前面,两个任务time时间相同时,先提交的在前面
- ScheduledFutureTask中含有time(被执行的时间)、sequenceNumber(被添加的序号)、period(间隔周期)
四种线程池简单使用:https://blog.csdn.net/qq_40788718/article/details/103104205
3. FutureTask
AQS:https://juejin.im/post/5aeb07ab6fb9a07ac36350c8
FutureTask是基于AQS实现的,同时FutureTask继承继承了RunnableFuture,所以既可以作为Future接收Callable的返回值,又能作为Runnale被执行。
FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等。
原文链接:https://blog.csdn.net/linchunquan/article/details/22382487