JDK
版本:AdoptOpenJDK 11.0.10+9
1 基本概念
j.u.c
提供了一套完整的线程池框架,主要包括:
Executor
接口 —— 执行器。ExecutorService
接口 —— 增强型执行器。ScheduledExecutorService
接口 —— 周期任务调度执行器。
Executor
(发音:一个在Q特儿)
2 Executor 接口
Executor
接口的目的是为了 解耦任务本身和任务的执行,只有一个execute(Runnable command)
方法,执行实现 Runnable
接口的任务。
public interface Executor {
void execute(Runnable command);
}
Executor
只是一个接口,根据其不同的实现类,可以有多种执行任务的方式。例如,同步执行、异步执行、延迟执行、周期执行等等。
3 ExecutorService 接口
为了对 Executor
提供的功能进行增强,j.u.c
提供了一个继承 Executor
的接口 ExecutorService
接口:
public interface ExecutorService extends Executor {
......
}
ExecutorService
增强了对任务的控制,提供的方法很多,主要分为四类:
- 关闭执行器,终止任务执行;
- 获取执行器状态;
- 异步执行任务;
- 批处理任务;
3.1 关闭执行器
(1)
void shutdown();
关闭执行器。
特点如下:
- 已经提交给当前执行器的任务将会继续执行完毕,但是不再接受新任务;
- 如果执行器已经关闭了,再次调用该方法没有任何影响。
(2)
List<Runnable> shutdownNow();
立即关闭执行器。
特点如下:
- 尝试停止所有正在执行的任务,无法保证能够停止成功;
- 暂停处理已经提交的但是未执行的任务;
- 返回从未开始执行的任务列表。
3.2 获取执行器状态
(1)
boolean isShutdown();
查看执行器是否已经 关闭,返回 true
表示已经关闭。
(2)
boolean isTerminated();
查看执行器是否已经 终止。
当且仅当执行器已经关闭并且所有任务都已经执行完成,才返回 true
。
(3)
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
调用该方法的线程将会被阻塞,直到执行器终止并返回 true
。如果超时或者被中断,调用线程也会被唤醒。
3.3 异步执行任务
(1)
<T> Future<T> submit(Callable<T> task);
提交并执行一个实现了 Callable
接口的任务,该任务的返回值可以通过 Future
对象返回。
调用 Future
的 get()
方法将会使当前线程阻塞,直到获取到返回值为止。
(2)
<T> Future<T> submit(Runnable task, T result);
提交并执行一个实现了 Runnable
接口的任务,通过 Future
的 get()
方法获取返回的 指定结果,指定结果是通过入参 result
指定的。
(3)
Future<?> submit(Runnable task);
提交并执行一个实现了 Runnable
接口的任务,通过 Future
的 get()
方法将会获取一个 null
值。
3.4 批处理任务
(1)
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
执行给定集合中的所有实现了 Callable
接口的任务,返回所有任务的 Future
对象。
该方法能够响应中断。
该方法为同步方法,必须等待所有任务执行完才返回。
(2)
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
执行给定集合中的所有实现了 Callable
接口的任务,返回所有任务的 Future
对象。
该方法能够响应中断。
该方法可指定超时时间。
该方法为同步方法,必须等待所有任务执行完才返回。
(3)
<T> T invokeAny(Collection<? extends