- 所有父级接口:
AutoCloseable,Executor
- 所有已知的子接口:
ScheduledExecutorService
Executor 提供管理终止的方法,以及可以生成 Future 以跟踪一个或多个异步任务进度的方法。
ExecutorService 可以关闭,这将导致它拒绝新任务。提供了两种不同的方法来关闭 ExecutorService。 shutdown() 方法将允许先前提交的任务在终止之前执行,而 shutdownNow() 方法阻止等待任务启动并尝试停止当前正在执行的任务。终止后,执行者没有正在执行的任务,没有等待执行的任务,也没有新的任务可以提交。应关闭未使用的 ExecutorService 以回收其资源。
方法 submit 通过创建并返回可用于取消执行和/或等待完成的 Future 来扩展基本方法 Executor.execute(Runnable) 。 invokeAny 和 invokeAll 方法执行最常用的批量执行形式,执行一组任务,然后等待至少一个或所有任务完成。 (类 ExecutorCompletionService 可用于编写这些方法的自定义变体。)
Executors 类为该包中提供的执行程序服务提供工厂方法。
使用示例
这是一个网络服务的草图,其中线程池中的线程为传入请求提供服务。它使用预先配置的Executors.newFixedThreadPool(int) 工厂方法:
class NetworkService implements Runnable {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize)
throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
public void run() { // run the service
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request on socket
}
} 也可以按如下方式建立和关闭(关闭、阻塞直到终止)一个 ExecutorService;用不同的 Executors 工厂方法进行说明:
try (ExecutorService e = Executors.newWorkStealingPool()) {
// submit or execute many tasks with e ...
} 还可以进一步定制。例如,以下方法分两个阶段关闭 ExecutorService,首先调用 shutdown 拒绝传入任务,然后调用 shutdownNow,如有必要,取消任何延迟任务:
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ex) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
内存一致性影响:在将 Runnable 或 Callable 任务提交给 ExecutorService 发生在之前 任务之前线程中的操作发生在之前结果通过 Future.get() 检索。
- 自从:
- 1.5
-
方法总结
修饰符和类型方法描述booleanawaitTermination(long timeout, TimeUnit unit) 阻塞直到所有任务在关闭请求后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。default voidclose()启动有序关闭,其中执行先前提交的任务,但不会接受新任务。invokeAll(Collection<? extends Callable<T>> tasks) 执行给定的任务,在所有任务完成时返回一个 Futures 列表,其中包含它们的状态和结果。invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 执行给定的任务,返回一个 Futures 列表,当所有任务完成或超时到期时(以先发生者为准),保存它们的状态和结果。<T> TinvokeAny(Collection<? extends Callable<T>> tasks) 执行给定的任务,返回成功完成的任务的结果(即,没有抛出异常),如果有的话。<T> TinvokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 执行给定的任务,返回已成功完成的任务的结果(即,没有抛出异常),如果在给定的超时结束之前有任何执行的话。boolean如果此执行程序已关闭,则返回true。boolean如果关闭后所有任务都已完成,则返回true。voidshutdown()启动有序关闭,其中执行先前提交的任务,但不会接受新任务。尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。Future<?>提交一个 Runnable 任务以供执行并返回一个代表该任务的 Future。<T> Future<T>提交一个 Runnable 任务以供执行并返回一个代表该任务的 Future。<T> Future<T>提交一个有返回值的任务以供执行,并返回一个代表任务未决结果的 Future。
-
方法详情
-
shutdown
void shutdown()启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,则调用没有额外效果。该方法不等待之前提交的任务完成执行。使用
awaitTermination来做到这一点。- 抛出:
SecurityException- 如果存在安全管理器并且关闭此 ExecutorService 可能会操作不允许调用者修改的线程,因为它不包含RuntimePermission("modifyThread"),或者安全管理器的checkAccess方法拒绝访问。
-
shutdownNow
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。此方法不等待主动执行的任务终止。使用
awaitTermination来做到这一点。除了尽最大努力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过
Thread.interrupt()取消,因此任何未能响应中断的任务可能永远不会终止。- 返回:
- 从未开始执行的任务列表
- 抛出:
SecurityException- 如果存在安全管理器并且关闭此 ExecutorService 可能会操作不允许调用者修改的线程,因为它不包含RuntimePermission("modifyThread"),或者安全管理器的checkAccess方法拒绝访问。
-
isShutdown
boolean isShutdown()如果此执行程序已关闭,则返回true。- 返回:
true如果这个执行器已经关闭
-
isTerminated
boolean isTerminated()如果关闭后所有任务都已完成,则返回true。请注意,除非先调用shutdown或shutdownNow,否则isTerminated永远不会是true。- 返回:
true如果关闭后所有任务都已完成
-
awaitTermination
阻塞直到所有任务在关闭请求后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。- 参数:
timeout- 最长时间等待unit- 超时参数的时间单位- 返回:
true如果此执行程序终止,false如果超时在终止前结束- 抛出:
InterruptedException- 如果在等待时被打断
-
submit
提交一个有返回值的任务以供执行,并返回一个代表任务未决结果的 Future。 Future 的get方法将在成功完成后返回任务结果。如果你想立即阻塞等待任务,你可以使用
result = exec.submit(aCallable).get();形式的结构注意:
Executors类包含一组方法,可以将一些其他常见的类似闭包的对象(例如,PrivilegedAction转换为Callable形式)以便提交。- 类型参数:
T- 任务结果的类型- 参数:
task- 要提交的任务- 返回:
- 代表任务未决完成的 Future
- 抛出:
RejectedExecutionException- 如果无法安排任务执行NullPointerException- 如果任务为空
-
submit
提交一个 Runnable 任务以供执行并返回一个代表该任务的 Future。 Future 的get方法将在成功完成后返回给定的结果。- 类型参数:
T- 结果的类型- 参数:
task- 要提交的任务result- 要返回的结果- 返回:
- 代表任务未决完成的 Future
- 抛出:
RejectedExecutionException- 如果无法安排任务执行NullPointerException- 如果任务为空
-
submit
提交一个 Runnable 任务以供执行并返回一个代表该任务的 Future。 Future 的get方法将在 successful 完成后返回null。- 参数:
task- 要提交的任务- 返回:
- 代表任务未决完成的 Future
- 抛出:
RejectedExecutionException- 如果无法安排任务执行NullPointerException- 如果任务为空
-
invokeAll
<T> List <Future <T>> invokeAll(Collection <? extends Callable <T>> tasks) throws InterruptedException 执行给定的任务,在所有任务完成时返回一个 Futures 列表,其中包含它们的状态和结果。Future.isDone()是返回列表中每个元素的true。请注意,completed 任务可以正常终止或通过抛出异常终止。如果在执行此操作时修改了给定的集合,则此方法的结果是未定义的。- 类型参数:
T- 从任务返回的值的类型- 参数:
tasks- 任务集合- 返回:
- 代表任务的 Futures 列表,顺序与迭代器为给定任务列表生成的顺序相同,每个任务都已完成
- 抛出:
InterruptedException- 如果在等待时被打断,在这种情况下未完成的任务将被取消NullPointerException- 如果任务或其任何元素是nullRejectedExecutionException- 如果无法安排任何任务执行
-
invokeAll
<T> List <Future <T>> invokeAll(Collection <? extends Callable <T>> tasks, long timeout, TimeUnit unit) throws InterruptedException 执行给定的任务,返回一个 Futures 列表,当所有任务完成或超时到期时(以先发生者为准),保存它们的状态和结果。Future.isDone()是返回列表中每个元素的true。返回时,未完成的任务将被取消。请注意,completed 任务可以正常终止或通过抛出异常终止。如果在执行此操作时修改了给定的集合,则此方法的结果是未定义的。- 类型参数:
T- 从任务返回的值的类型- 参数:
tasks- 任务集合timeout- 最长时间等待unit- 超时参数的时间单位- 返回:
- 代表任务的 Futures 列表,其顺序与迭代器为给定任务列表生成的顺序相同。如果操作没有超时,则每个任务都已完成。如果确实超时,则其中一些任务将不会完成。
- 抛出:
InterruptedException- 如果在等待时被打断,在这种情况下未完成的任务将被取消NullPointerException- 如果任务、它的任何元素或单元是nullRejectedExecutionException- 如果无法安排任何任务执行
-
invokeAny
<T> T invokeAny(Collection <? extends Callable <T>> tasks) throws InterruptedException , ExecutionException 执行给定的任务,返回成功完成的任务的结果(即,没有抛出异常),如果有的话。在正常或异常返回时,未完成的任务将被取消。如果在执行此操作时修改了给定的集合,则此方法的结果是未定义的。- 类型参数:
T- 从任务返回的值的类型- 参数:
tasks- 任务集合- 返回:
- 其中一项任务返回的结果
- 抛出:
InterruptedException- 如果在等待时被打断NullPointerException- 如果要执行的任务或任何元素任务是nullIllegalArgumentException- 如果任务为空ExecutionException- 如果没有任务成功完成RejectedExecutionException- 如果无法安排任务执行
-
invokeAny
<T> T invokeAny(Collection <? extends Callable <T>> tasks, long timeout, TimeUnit unit) throws InterruptedException , ExecutionException , TimeoutException 执行给定的任务,返回已成功完成的任务的结果(即,没有抛出异常),如果在给定的超时结束之前有任何执行的话。在正常或异常返回时,未完成的任务将被取消。如果在执行此操作时修改了给定的集合,则此方法的结果是未定义的。- 类型参数:
T- 从任务返回的值的类型- 参数:
tasks- 任务集合timeout- 最长时间等待unit- 超时参数的时间单位- 返回:
- 其中一项任务返回的结果
- 抛出:
InterruptedException- 如果在等待时被打断NullPointerException- 如果任务、单元或任何要执行的元素任务是nullTimeoutException- 如果给定超时在任何任务成功完成之前过去ExecutionException- 如果没有任务成功完成RejectedExecutionException- 如果无法安排任务执行
-
close
default void close()启动有序关闭,其中执行先前提交的任务,但不会接受新任务。此方法等待所有任务执行完毕且执行程序终止。如果在等待时被中断,此方法将停止所有正在执行的任务,就像通过调用
shutdownNow()一样。然后它继续等待,直到所有正在执行的任务都完成。等待执行的任务不会执行。在此方法返回之前,中断状态将被重新断言。如果已经终止,则调用此方法无效。
- 指定者:
close在接口AutoCloseable中- 实现要求:
-
默认实现调用
shutdown()并使用awaitTermination等待任务完成执行。 - 抛出:
SecurityException- 如果存在安全管理器并且关闭此 ExecutorService 可能会操作不允许调用者修改的线程,因为它不包含RuntimePermission("modifyThread"),或者安全管理器的checkAccess方法拒绝访问。- 自从:
- 19
-