-
- All Superinterfaces:
-
Executor
- All Known Subinterfaces:
-
ScheduledExecutorService
public interface ExecutorServiceextends Executor
Executor
,提供管理终止的方法和可生成Future
以跟踪一个或多个异步任务进度的方法。可以关闭
ExecutorService
,这将导致它拒绝新任务。 关闭ExecutorService
提供了两种不同的方法。shutdown()
方法将允许先前提交的任务在终止之前执行,而shutdownNow()
方法可防止等待任务启动并尝试停止当前正在执行的任务。 终止时,执行程序没有正在执行的任务,没有等待执行的任务,也没有任何新任务可以提交。 应关闭未使用的ExecutorService
以允许回收其资源。方法
submit
延伸的基方法Executor.execute(Runnable)
通过创建并返回一个Future
,可用于取消执行和/或等待完成。 方法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
两个阶段关闭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 ie) { // (Re-)Cancel if current thread also interrupted pool.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); } }
内存一致性效果:在将
Runnable
或Callable
任务提交到ExecutorService
happen-before之前的一个线程中的操作,该任务采取的任何操作都会发生 - 在通过Future.get()
检索结果之前 。- 从以下版本开始:
- 1.5
-
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 boolean
awaitTermination(long timeout, TimeUnit unit)
阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程被中断,以先发生者为准。<T> List<Future<T>>
invokeAll(Collection<? extends Callable<T>> tasks)
执行给定的任务,返回完成所有状态和结果的Futures列表。<T> List<Future<T>>
invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
执行给定的任务,返回一个Futures列表,在完成或超时到期时保持其状态和结果,以先发生者为准。<T> T
invokeAny(Collection<? extends Callable<T>> tasks)
执行给定的任务,返回已成功完成的任务的结果(即,不抛出异常),如果有的话。<T> T
invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
执行给定的任务,返回已成功完成的任务的结果(即,不抛出异常),如果在给定的超时之前已经执行了任何操作。boolean
isShutdown()
如果此执行程序已关闭,则返回true
。boolean
isTerminated()
如果关闭后所有任务都已完成,则返回true
。void
shutdown()
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。List<Runnable>
shutdownNow()
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。Future<?>
submit(Runnable task)
提交Runnable任务以执行并返回表示该任务的Future。<T> Future<T>
submit(Runnable task, T result)
提交Runnable任务以执行并返回表示该任务的Future。<T> Future<T>
submit(Callable<T> task)
提交值返回任务以执行并返回表示任务的挂起结果的Future。
-
-
-
方法详细信息
-
shutdown
void shutdown()
- 异常
-
SecurityException
- 如果存在安全管理器并关闭此ExecutorService,则可能会操纵不允许调用者修改的线程,因为它不容纳RuntimePermission
("modifyThread")
,或者安全管理器的checkAccess
方法拒绝访问。
-
shutdownNow
List<Runnable> shutdownNow()
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。此方法不等待主动执行任务终止。 使用
awaitTermination
来做到这一点。除了尽力尝试停止处理主动执行任务之外,没有任何保证。 例如,典型的实现将通过
Thread.interrupt()
取消,因此任何无法响应中断的任务都可能永远不会终止。- 结果
- 从未开始执行的任务列表
- 异常
-
SecurityException
- 如果存在安全管理器并且关闭此ExecutorService,则可以操纵不允许调用者修改的线程,因为它不存在RuntimePermission
("modifyThread")
,或者安全管理器的checkAccess
方法拒绝访问。
-
isShutdown
boolean isShutdown()
如果此执行程序已关闭,则返回true
。- 结果
-
true
如果此执行程序已关闭
-
isTerminated
boolean isTerminated()
如果关闭后所有任务都已完成,则返回true
。 请注意,isTerminated
永远不会是true
除非先调用shutdown
或shutdownNow
。- 结果
-
true
如果关闭后所有任务都已完成
-
awaitTermination
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程被中断,以先发生者为准。- 参数
-
timeout
- 等待的最长时间 -
unit
- 超时参数的时间单位 - 结果
-
true
如果此执行终止,false
,如果超时终止前经过 - 异常
-
InterruptedException
- 如果在等待时中断
-
submit
<T> Future<T> submit(Callable<T> task)
提交值返回任务以执行并返回表示任务的挂起结果的Future。 Future的get
方法将在成功完成后返回任务的结果。如果您想立即阻止等待任务,可以使用
result = exec.submit(aCallable).get();
表单的result = exec.submit(aCallable).get();
注意:
Executors
类包含一组方法,可以转换一些其他常见的类似闭包的对象,例如,PrivilegedAction
到Callable
表单,以便可以提交它们。- 参数类型
-
T
- 任务结果的类型 - 参数
-
task
- 要提交的任务 - 结果
- 表示未完成任务的Future
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为空
-
submit
<T> Future<T> submit(Runnable task, T result)
提交Runnable任务以执行并返回表示该任务的Future。 Future'sget
方法将在成功完成后返回给定结果。- 参数类型
-
T
- 结果的类型 - 参数
-
task
- 要提交的任务 -
result
- 返回的结果 - 结果
- 表示未完成任务的Future
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为空
-
submit
Future<?> submit(Runnable task)
提交Runnable任务以执行并返回表示该任务的Future。 成功完成后,Future的get
方法将返回null
。- 参数
-
task
- 要提交的任务 - 结果
- 表示未完成任务的Future
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为空
-
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
执行给定的任务,返回完成所有状态和结果的Futures列表。 对于返回列表的每个元素,Future.isDone()
是true
。 请注意,已完成的任务可能正常终止或通过抛出异常终止。 如果在此操作正在进行时修改了给定集合,则此方法的结果未定义。- 参数类型
-
T
- 从任务返回的值的类型 - 参数
-
tasks
- 任务集合 - 结果
- 表示任务的Futures列表,与迭代器为给定任务列表生成的顺序相同,每个已完成
- 异常
-
InterruptedException
- 如果在等待时被中断,则在这种情况下取消未完成的任务 -
NullPointerException
- 如果任务或其任何元素是null
-
RejectedExecutionException
- 如果无法安排任何任务执行
-
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
执行给定的任务,返回一个Futures列表,在完成或超时到期时保持其状态和结果,以先发生者为准。Future.isDone()
对于返回列表的每个元素是true
。 返回后,未完成的任务将被取消。 请注意,已完成的任务可能正常终止或通过抛出异常终止。 如果在此操作正在进行时修改了给定集合,则此方法的结果未定义。- 参数类型
-
T
- 从任务返回的值的类型 - 参数
-
tasks
- 任务集合 -
timeout
- 等待的最长时间 -
unit
- 超时参数的时间单位 - 结果
- 表示任务的Futures列表,其顺序与迭代器为给定任务列表生成的顺序相同。 如果操作没有超时,则每个任务都将完成。 如果确实超时,其中一些任务将无法完成。
- 异常
-
InterruptedException
- 如果在等待时中断,则在此情况下取消未完成的任务 -
NullPointerException
- 如果任务,其任何元素或单位是null
-
RejectedExecutionException
- 如果无法安排任何任务执行
-
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
执行给定的任务,返回已成功完成的任务的结果(即,不抛出异常),如果有的话。 正常或特殊退货后,未完成的任务将被取消。 如果在此操作正在进行时修改了给定集合,则此方法的结果未定义。- 参数类型
-
T
- 从任务返回的值的类型 - 参数
-
tasks
- 任务集合 - 结果
- 其中一个任务返回的结果
- 异常
-
InterruptedException
- 等待时中断 -
NullPointerException
- 如果要执行的任务或任何元素任务是null
-
IllegalArgumentException
- 如果任务为空 -
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
- 如果要执行的任务,单元或任何元素任务是null
-
TimeoutException
- 如果在任何任务成功完成之前TimeoutException
了给定的超时 -
ExecutionException
- 如果没有任务成功完成 -
RejectedExecutionException
- if tasks cannot be scheduled for execution
-
-