Executor
- 提供了void execute(Runnable command);方法。执行command任务,将任务的定义以及运行分离。
ExecutorService
- 继承了Executor,完善了任务执行器的生命周期。
- 提供了submit方法(异步执行任务),将任务完成的返回值封装到Future中。
Callable
- 和Runnable类似,提供了call方法。与Runnable的run方法不同的是,call方法有返回值。
Future
- 代表任务执行的结果,将任务完成的返回值封装到future。
- 通过get()方法获取任务返回值。
- get是阻塞方法,知道可以获取结果才会往下执行。
FutureTask
- 既是一个Future也是一个Callable(实现了RunnableFuture,RunnableFuture继承了Runnable以及Future)。
CompletableFuture
- 提供了对单个以及批量任务的管理方案。
ThreadPoolExecutor
- 继承自AbstractExecutorService(AbstractExecutorService实现了ExecutorService,ExecutorService继承了Executor)。
- 内部维护了两个集合,一个是线程集合,一个是任务集合。 七个参数简介
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runn able> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler);
-
- corePoolSize:核心线程数,核心线程是即使空闲时间超过了生存时间也不会被回收。
- maximumPoolsize:最大线程数,最多有多少个线程。
- keepAliveTime:生存时间,线程超过多久没有执行任务会被回收,数量等于核心线程数时不再回收线程。
- unit:生存时间的单位
- workQueue:任务队列,BlockingQueue(使用不同的BlockingQueue会产生不同的线程池)。
- threadFactory:线程工厂,需要实现ThreadFactory,可以自定义实现。
- handler:拒绝策略,线程池所有线程都在忙碌状态,而且任务队列已满,需要执行拒绝策略。拒绝策略可以自定义,默认提供了四种(一般情况都是自定义策略)。
- Abort:抛异常。
- Discard:扔掉,不抛异常。
- DiscardOldest:扔掉排队时间最久的。
- CallerRuns:调用者处理任务。
ForkJoinPool
- 分解汇总的任务。
- 用很少的线程可以执行很多的任务(子任务)TPE做不到先执行子任务。
- CPU密集型
Executors
线程工具类,可以看做是线程池的工厂。
- SingleThreadExecutor
- 线程池中只有一个线程。
- 为什么要有单线程的线程池?
- 有任务队列,可以管理线程的生命周期。
- CachedThreadPool
- 核心线程数为0,最大线程数时Integer.MAX_VALUE,生存时间为60s,任务队列是SynchronousQueue(来一个任务就会被线程执行)。
- FixedThreadPool
- 核心线程=最大线程(固定数量线程池)。
- Cached VS Fixed
- 如果任务请求不平均,使用Cached。
- 如果任务请求比较平稳,使用Fixed。