java.util.concurrent 接口 ExecutorService
2014-05-08 01:21
309 查看
java.util.concurrent
接口 ExecutorService
所有超级接口: Executor所有已知子接口: ScheduledExecutorService
所有已知实现类: AbstractExecutorService,
ScheduledThreadPoolExecutor,
ThreadPoolExecutor
public interface ExecutorServiceextends Executor
Executor提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成
Future的方法。
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。
shutdown()方法在终止前允许执行以前提交的任务,而
shutdownNow()方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的
ExecutorService 以允许回收其资源。
通过创建并返回一个可用于取消执行和/或等待完成的
Future,方法 submit 扩展了基本方法
Executor.execute(java.lang.Runnable)。方法
invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,或全部任务完成(可使用
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); } publicvoid 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; } publicvoid run() { // read and service request on socket } }
下列方法分两个阶段关闭 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(); } }
内存一致性效果:线程中向
ExecutorService提交
Runnable或
Callable任务之前的操作
happen-before 由该任务所提取的所有操作,后者依次 happen-before 通过
Future.get()获取的结果。
从以下版本开始: 1.5
方法摘要 | ||
---|---|---|
boolean | awaitTermination(long timeout, TimeUnit unit) 请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。 | |
| invokeAll(Collection<? extends Callable<T>> tasks) 执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。 | |
| invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表。 | |
| invokeAny(Collection<? extends Callable<T>> tasks) 执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。 | |
| invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 执行给定的任务,如果在给定的超时期满前某个任务已成功完成(也就是未抛出异常),则返回其结果。 | |
boolean | isShutdown() 如果此执行程序已关闭,则返回 true。 | |
boolean | isTerminated() 如果关闭后所有任务都已完成,则返回 true。 | |
void | shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。 | |
List<Runnable> | shutdownNow() 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。 | |
| submit(Callable<T> task) 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。 | |
Future<?> | submit(Runnable task) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 | |
| submit(Runnable task, T result) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 |
从接口 java.util.concurrent.Executor 继承的方法 |
---|
execute |
方法详细信息 |
---|
shutdown
void shutdown()
启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。
抛出:
SecurityException- 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持
RuntimePermission("modifyThread")),或者安全管理器的
checkAccess 方法拒绝访问。
shutdownNow
List<Runnable> shutdownNow()
试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
无法保证能够停止正在处理的活动执行任务,但是会尽力尝试。例如,通过
Thread.interrupt()来取消典型的实现,所以任何任务无法响应中断都可能永远无法终止。
返回:从未开始执行的任务的列表 抛出:
SecurityException- 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持
RuntimePermission("modifyThread")),或者安全管理器的
checkAccess 方法拒绝访问。
isShutdown
boolean isShutdown()
如果此执行程序已关闭,则返回 true。
返回:如果此执行程序已关闭,则返回 true
isTerminated
boolean isTerminated()
如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则
isTerminated 永不为 true。
返回:如果关闭后所有任务都已完成,则返回 true
awaitTermination
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException
请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。
参数:
timeout- 最长等待时间
unit- timeout 参数的时间单位 返回:如果此执行程序终止,则返回 true;如果终止前超时期满,则返回 false 抛出:
InterruptedException- 如果等待时发生中断
submit
<T> Future<T> submit(Callable<T> task)
提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。
如果想立即阻塞任务的等待,则可以使用 result = exec.submit(aCallable).get(); 形式的构造。
注:
Executors类包括了一组方法,可以转换某些其他常见的类似于闭包的对象,例如,将
PrivilegedAction转换为
Callable形式,这样就可以提交它们了。
参数:
task- 要提交的任务 返回:表示任务等待完成的 Future 抛出:
RejectedExecutionException- 如果任务无法安排执行
NullPointerException- 如果该任务为 null
submit
<T> Future<T> submit(Runnable task, T result)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果。
参数:
task- 要提交的任务
result- 返回的结果 返回:表示任务等待完成的 Future 抛出:
RejectedExecutionException- 如果任务无法安排执行
NullPointerException- 如果该任务为 null
submit
Future<?> submit(Runnable task)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完成时将会返回
null。
参数:
task- 要提交的任务 返回:表示任务等待完成的 Future 抛出:
RejectedExecutionException- 如果任务无法安排执行
NullPointerException- 如果该任务为 null
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的
Future.isDone()为 true。注意,可以正常地或通过抛出异常来终止已完成 任务。如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。
参数:
tasks- 任务 collection 返回:表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同,每个任务都已完成。 抛出:
InterruptedException- 如果等待时发生中断,在这种情况下取消尚未完成的任务。
NullPointerException- 如果任务或其任意元素为
null
RejectedExecutionException- 如果所有任务都无法安排执行
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表。返回列表的所有元素的
Future.isDone()为 true。一旦返回后,即取消尚未完成的任务。注意,可以正常地或通过抛出异常来终止已完成 任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
参数:
tasks- 任务 collection
timeout- 最长等待时间
unit- timeout 参数的时间单位 返回:表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同。如果操作未超时,则已完成所有任务。如果确实超时了,则某些任务尚未完成。 抛出:
InterruptedException- 如果等待时发生中断,在这种情况下取消尚未完成的任务
NullPointerException- 如果任务或其任意元素或 unit 为
null
RejectedExecutionException- 如果所有任务都无法安排执行
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
参数:
tasks- 任务 collection 返回:某个任务返回的结果 抛出:
InterruptedException- 如果等待时发生中断
NullPointerException- 如果任务或其任意元素为
null
IllegalArgumentException- 如果任务为空
ExecutionException- 如果没有任务成功完成
RejectedExecutionException- 如果任务无法安排执行
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
执行给定的任务,如果在给定的超时期满前某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
参数:
tasks- 任务 collection
timeout- 最长等待时间
unit- timeout 参数的时间单位 返回:某个任务返回的结果 抛出:
InterruptedException- 如果等待时发生中断
NullPointerException- 如果任务或其任意元素或 unit 为
null
TimeoutException- 如果在所有任务成功完成之前给定的超时期满
ExecutionException- 如果没有任务成功完成
RejectedExecutionException- 如果任务无法安排执行
相关文章推荐
- 超时,可以用Java线程池ExecutorService类配合Future接口来实现
- ScheduledExecutorService接口
- java定时任务接口ScheduledExecutorService
- 线程池系列--ExecutorService接口:任务提交
- java中ExecutorService接口
- java.util.concurrent翻译----Executor框架--接口ExecutorService
- 聊聊高并发(三十九)解析java.util.concurrent各个组件(十五) 理解ExecutorService接口的设计
- 线程池系列--ExecutorService接口:关闭线程池
- ScheduledExecutorService执行定时任务接口
- java定时任务接口ScheduledExecutorService
- 定时任务接口ScheduledExecutorService
- ExecutorService接口概要
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- java定时任务接口ScheduledExecutorService
- java定时任务接口ScheduledExecutorService
- ScheduledExecutorService接口介绍
- Java线程之线程池--接口Executor、ExecutorService
- java定时任务接口ScheduledExecutorService
- 使用ScheduledExecutorService接口实现Web轮询项目
- ScheduleExecutorService接口和spring控制定时任务的理解