宁乡市住房和城乡建设局网站,单位网站建设情况,微信的网站开发,wordpress 博客园主题ExecutorService源码解读〇、[源码版本] jdk 1.8一、ExecutorService接口详解1、ExecutorService关闭方法概述[举例1]代码示例2、ExecutorService任务执行方法概述3、Executors工厂方法概述[举例1]代码示例4、内存一致性影响二、接口方法详解1、shutdown方法2、shutdownNow方法…
ExecutorService源码解读〇、[源码版本] jdk 1.8一、ExecutorService接口详解1、ExecutorService关闭方法概述[举例1]代码示例2、ExecutorService任务执行方法概述3、Executors工厂方法概述[举例1]代码示例4、内存一致性影响二、接口方法详解1、shutdown方法2、shutdownNow方法3、isShutdown方法4、isTerminated方法5、awaitTermination方法6、submit方法7、invokeAll方法8、invokeAny方法〇、[源码版本] jdk 1.8
一、ExecutorService接口详解
1、ExecutorService关闭方法概述
继承自Executor提供管理终止的方法和可以生成Future以跟踪一个或多个异步任务进度的方法。 一个ExecutorService可以被关闭这将导致它拒绝新任务。未使用的ExecutorService应该关闭以允许回收其资源。
ExecutorService接口提供了两种不同的方法来关闭一个ExecutorService。 1shutdown方法将允许先前提交的任务在终止之前执行。 2shutdownNow方法防止等待任务开始并尝试停止当前正在执行的任务。
终止时ExecutorService没有正在执行的任务没有等待执行的任务也没有新的任务可以提交。
[举例1]代码示例
以下方法分两个阶段关闭ExecutorService首先通过调用shutdown方法拒绝传入任务然后调用shutdownNow方法如有必要则取消任何的延迟任务。 void shutdownAndAwaitTermination(ExecutorService pool) {pool.shutdown(); // 禁止提交新任务try {// 等待现有任务终止if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {pool.shutdownNow(); // 取消当前正在执行的任务// 等待任务响应被取消if (!pool.awaitTermination(60, TimeUnit.SECONDS))System.err.println(Pool did not terminate);}} catch (InterruptedException ie) {// 重新取消如果当前线程也被中断pool.shutdownNow();// 保留中断状态Thread.currentThread().interrupt();}}2、ExecutorService任务执行方法概述
1方法submit继承自基本方法Executor接口的execute(Runnable)方法创建并返回一个Future可用于取消执行和或等待完成。 2方法invokeAny和invokeAll以最常用的批量执行的形式执行执行一组任务然后等待至少一个或等待全部完成。
类ExecutorCompletionService可用于编写这些方法的自定义变量。使用提供的Executor执行任务的CompletionService。此类安排提交的任务在完成后放置在使用take()方法可访问的队列中。该类足够轻量级适合临时使用在处理任务组时。
3、Executors工厂方法概述
Executors类为concurrent包中提供的ExecutorService提供了工厂方法。
[举例1]代码示例
在一个网络服务线程池服务中的线程传入请求。 使用了预配置的Executors的newFixedThreadPool工厂方法。
public static ExecutorService newFixedThreadPool(int nThreads)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 servicetry {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}}4、内存一致性影响
在将Runnable或Callable任务提交给ExecutorService之前线程中的操作。内存可见性发生在该任务采取的任何操作之前发生在结果通过Future.get()取回之前。
二、接口方法详解
1、shutdown方法
void shutdown();启动有序关闭其中先前提交的任务终止之前任然执行但不会接受新任务。
ExecutorService如果已经关闭调用没有额外的效果。 此方法不等待先前提交的任务完成执行。 使用 awaitTermination方法来做到这一点。
a.参数无 b.返回无 c.异常 throws SecurityException 如果存在安全管理器并且正在关闭此ExecutorService可能会操纵manipulate线程。使调用者不允许修改线程因为它不持有java.lang.RuntimePermission里的modifyThread或安全管理器的checkAccess方法拒绝调用者访问。
2、shutdownNow方法
NotNull ListRunnable shutdownNow();尝试停止所有正在执行的任务停止等待任务的处理并返回等待执行的任务列表。
此方法不等待正在执行的任务终止。使用awaitTermination来做到这一点。
除了尽最大努力停止处理正在执行的任务之外没有任何保证。 例如一些典型的实现对象将通过Thread的interrupt方法取消因此任何响应中断失败的任务可能永远不会终止。
a.参数无 b.返回无 c.异常 throws SecurityException 如果存在安全管理器并且正在关闭此ExecutorService可能会操纵manipulate线程。使调用者不允许修改线程因为它不持有java.lang.RuntimePermission里的modifyThread或安全管理器的checkAccess方法拒绝调用者访问。
3、isShutdown方法
boolean isShutdown();如果ExecutorService已关闭则返回true。
a.参数无 b.返回true ExecutorService已关闭 c.异常无
4、isTerminated方法
boolean isTerminated();如果ExecutorService关闭后所有任务都已完成则返回true。 请注意除非先调用shutdown或shutdownNow否则 isTerminated永远不会返回true。
a.参数无 b.返回true ExecutorService关闭后所有任务都已完成 c.异常无
5、awaitTermination方法
boolean awaitTermination(long timeout, NotNull TimeUnit unit) throws InterruptedException;阻塞直到所有任务在一个关闭的请求后完成执行或者超时发生或者当前线程被中断以先发生者为准。
a.参数 timeout 最大超时等待时长 unit 超时参数timeout的时间单位 b.返回 true ExecutorService终止 false ExecutorService终止前超时 c.异常 throws InterruptedException 如果等待时中断
6、submit方法
NotNull T FutureT submit(NotNull CallableT task);提交一个返回值的任务进行执行并返回一个代表任务未决结果的Future。Future的 get方法将在成功完成后返回任务的结果。
如果您想立即阻止等待任务您可以使用 result exec.submit(aCallable).get();形式的构造。
请注意Executors类包含一组方法可以将一些其他常见的类似闭包的对象例如java.security.PrivilegedAction转换为Callable形式以便它们可以被提交。
a.参数 task CallableT类型的要提交的任务 T 任务结果的类型 b.返回 代表待完成任务的Future c.异常 throws RejectedExecutionException 如果任务不能安排执行 throws NullPointerException 如果参数task为null
NotNull T FutureT submit(NotNull Runnable task, T result);提交Runnable任务以供执行并返回代表该任务的Future。 Future 的get方法将在成功完成后返回给定的result。
a.参数 task Runnable类型的要提交的任务 result 任务返回的结果 T 任务结果的类型 b.返回 代表待完成任务的Future c.异常 throws RejectedExecutionException 如果任务不能安排执行 throws NullPointerException 如果参数task为null
NotNull Future? submit(NotNull Runnable task);提交Runnable任务以供执行并返回代表该任务的Future。Future的get方法将在成功完成后返回null。
a.参数 task Runnable类型的要提交的任务 b.返回 代表待完成任务的Future c.异常 throws RejectedExecutionException 如果任务不能安排执行 throws NullPointerException 如果参数task为null
7、invokeAll方法
NotNull T ListFutureT invokeAll(NotNull Collection? extends CallableT tasks) throws InterruptedException;执行给定的任务返回一个Futures列表在所有完成后保存它们的状态和结果。Future的isDone遍历返回列表的每个元素是true。
请注意已完成任务可能会以正常方式、或通过抛出异常的方式终止。 如果在此操作进行时修改了给定的参数集合Collection则此方法的返回结果是不确定的。
a.参数 tasks Collection? extends CallableT类型的任务集合 T 从任务返回的值的类型 b.返回 代表任务的Future列表与迭代器为给定任务列表生成的顺序相同每个任务都已完成 c.异常 throws InterruptedException 如果在等待时中断在这种情况下未完成的任务将被取消 throws NullPointerException 任务集合或其任何元素是null throws RejectedExecutionException 如果任何任务不能安排执行
T ListFutureT invokeAll(Collection? extends CallableT tasks, long timeout, TimeUnit unit) throws InterruptedException;略
8、invokeAny方法
T T invokeAny(Collection? extends CallableT tasks) throws InterruptedException, ExecutionException;执行给定的任务返回已成功完成的任务的结果即不抛出异常如果有的话。在正常或异常返回时未完成的任务将被取消。
如果在此操作进行时修改了给定的集合则此方法的结果不确定的。
a.参数 tasks Collection? extends CallableT类型的任务集合 T 从任务返回的值的类型 b.返回 其中一项任务返回的结果 c.异常 throws InterruptedException 如果在等待时中断 throws NullPointerException 被执行时的任务集合或其任何元素是null throws IllegalArgumentException 任务集合为空 throws ExecutionException 如果没有任务成功完成 throws RejectedExecutionException 如果任何任务不能安排执行
T T invokeAny(Collection? extends CallableT tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;略