ExecutorService源码解读
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
。
1)shutdown
方法将允许先前提交的任务在终止之前执行。
2)shutdownNow
方法防止等待任务开始并尝试停止当前正在执行的任务。
终止时,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 List<Runnable> 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> Future<T> submit(@NotNull Callable<T> task);
提交一个返回值的任务进行执行,并返回一个代表任务未决结果的Future
。Future
的 get
方法将在成功完成后返回任务的结果。
如果您想立即阻止等待任务,您可以使用
result = exec.submit(aCallable).get();
形式的构造。
请注意:Executors
类包含一组方法可以将一些其他常见的类似闭包的对象,例如,java.security.PrivilegedAction
转换为Callable
形式,以便它们可以被提交。
a.参数:
task
Callable<T>
类型的要提交的任务
<T>
任务结果的类型
b.返回:
代表待完成任务的Future
c.异常:
throws RejectedExecutionException
如果任务不能安排执行
throws NullPointerException
如果参数task
为null
@NotNull <T> Future<T> 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> List<Future<T>> invokeAll(@NotNull Collection<? extends Callable<T>> tasks) throws InterruptedException;
执行给定的任务,返回一个Futures
列表,在所有完成后,保存它们的状态和结果。Future
的isDone
遍历返回列表的每个元素是true
。
请注意,已完成任务可能会以正常方式、或通过抛出异常的方式终止。
如果在此操作进行时修改了给定的参数集合Collection
,则此方法的返回结果是不确定的。
a.参数:
tasks
Collection<? extends Callable<T>>
类型的任务集合
<T>
从任务返回的值的类型
b.返回:
代表任务的Future
列表,与迭代器为给定任务列表生成的顺序相同,每个任务都已完成
c.异常:
throws InterruptedException
如果在等待时中断,在这种情况下未完成的任务将被取消
throws NullPointerException
任务集合,或其任何元素是null
throws RejectedExecutionException
如果任何任务不能安排执行
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;
略
8、invokeAny方法
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;
执行给定的任务,返回已成功完成的任务的结果(即,不抛出异常),如果有的话。在正常或异常返回时,未完成的任务将被取消。
如果在此操作进行时修改了给定的集合,则此方法的结果不确定的。
a.参数:
tasks
Collection<? extends Callable<T>>
类型的任务集合
<T>
从任务返回的值的类型
b.返回:
其中一项任务返回的结果
c.异常:
throws InterruptedException
如果在等待时中断
throws NullPointerException
被执行时的任务集合,或其任何元素是null
throws IllegalArgumentException
任务集合为空
throws ExecutionException
如果没有任务成功完成
throws RejectedExecutionException
如果任何任务不能安排执行
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
略
ExecutorService源码解读相关推荐
- Executors源码解读——创建ExecutorService线程池
Executors源码解读--创建ExecutorService线程池 〇.[源码版本] jdk 1.8 一.线程池概述 二.线程池创建 三.Executors源码解读 newFixedThreadP ...
- KClient——kafka消息中间件源码解读
目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...
- Future源码解读
Future源码解读 〇.[源码版本] jdk 1.8 一.Future概述 [举例1]示例代码 [举例2]示例代码 内存一致性影响 二.Future接口的方法 cancel方法 isCancelle ...
- Executor源码解读
Executor源码解读 〇.[源码版本] jdk 1.8 一.不再显式创建线程 [举例1]代码示例 二.不严格要求执行是异步的 [举例1]代码示例 三.任务在调用者线程之外的某个线程中执行 [举例1 ...
- 【Android】OkHttp源码解读逐字稿(2)-OkHttpClient
目录 0.前言 1.各个属性浅析 01.dispatcher 02.connectionPool 03.interceptors&networkInterceptors 04.eventLis ...
- Bert系列(二)——源码解读之模型主体
本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...
- Bert系列(三)——源码解读之Pre-train
https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...
- linux下free源码,linux命令free源码解读:Procps free.c
linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...
- nodeJS之eventproxy源码解读
1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...
最新文章
- Struts2标签库
- Linux主机WordPress伪静态设置方法
- 抖音用户规模达5.18亿,数据解读抖音支付背后逻辑?
- C++三大继承构造函数的执行顺序详解
- 加拿大达内科技_美股继续暴跌模式 达内教育却“暴走”股价近翻倍
- can总线报文是固定的吗_新能源汽车CAN总线Bus Off处理流程
- USACO-Section2.3 Zero Sum
- 避免下载Word/Excel文件时被IE开启
- 心玮医疗发布75万股权回购计划 用于招揽和激励员工等
- 雷军:电视机越大才越舒服!
- guestfish修改镜像内容
- 云计算网络基础架构的实践和演进
- 虚拟数字人的“风”,从“工业级”吹向“消费级”
- word另存为html行距,word文档如何设置行间距
- java中int型的最大值_java int 的最大值 Integer.MAX_VALUE
- 无线网络监控服务器怎么,无线监控系统如何安装?
- SpringDataJPA使用Specification动态查询和分页
- 量化评价和质化评价举例_数据质量量化评价研究与实现
- 当女生成为软件测试员,我才发现年薪30W+其实并不难…
- 史记花絮(四)——宋微子世家
热门文章
- 364. Nested List Weight SumII
- android Monkey 测试技巧
- Mac OSX 安装nvm(node.js版本管理器)
- spring AOP实现——xml方法
- X-UA-Compatible,IE8 兼容模式
- XenDesktop 5.5 – HDX RealTime TCP UDP Audio演示
- Jquery getJSON方法分析(二)
- linux dns 问题吗,Linux下DNS的问题
- [转载] java-继承和多态
- 茱莉亚分形_茱莉亚的NaN Constant