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)方法invokeAnyinvokeAll以最常用的批量执行的形式执行,执行一组任务,然后等待至少一个或等待全部完成。

ExecutorCompletionService可用于编写这些方法的自定义变量。使用提供的Executor执行任务的CompletionService。此类安排提交的任务,在完成后,放置在使用take()方法可访问的队列中。该类足够轻量级,适合临时使用在处理任务组时。

3、Executors工厂方法概述

Executors类为concurrent包中提供的ExecutorService提供了工厂方法。

[举例1]代码示例

在一个网络服务,线程池服务中的线程传入请求。
使用了预配置的ExecutorsnewFixedThreadPool工厂方法。

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、内存一致性影响

在将RunnableCallable任务提交给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来做到这一点。

除了尽最大努力停止处理正在执行的任务之外,没有任何保证。
例如,一些典型的实现对象将通过Threadinterrupt方法取消,因此任何响应中断失败的任务可能永远不会终止。

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。
请注意,除非先调用shutdownshutdownNow,否则 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);

提交一个返回值的任务进行执行,并返回一个代表任务未决结果的FutureFutureget方法将在成功完成后返回任务的结果。

如果您想立即阻止等待任务,您可以使用
result = exec.submit(aCallable).get();形式的构造。

请注意:Executors类包含一组方法可以将一些其他常见的类似闭包的对象,例如,java.security.PrivilegedAction转换为Callable形式,以便它们可以被提交。

a.参数:
task Callable<T>类型的要提交的任务
<T> 任务结果的类型
b.返回:
代表待完成任务的Future
c.异常:
throws RejectedExecutionException
如果任务不能安排执行
throws NullPointerException
如果参数tasknull

@NotNull <T> Future<T> submit(@NotNull Runnable task, T result);

提交Runnable任务以供执行并返回代表该任务的FutureFutureget方法将在成功完成后返回给定的result

a.参数:
task Runnable类型的要提交的任务
result 任务返回的结果
<T> 任务结果的类型
b.返回:
代表待完成任务的Future
c.异常:
throws RejectedExecutionException
如果任务不能安排执行
throws NullPointerException
如果参数tasknull

@NotNull Future<?> submit(@NotNull Runnable task);

提交Runnable任务以供执行并返回代表该任务的FutureFutureget方法将在成功完成后返回null

a.参数:
task Runnable类型的要提交的任务
b.返回:
代表待完成任务的Future
c.异常:
throws RejectedExecutionException
如果任务不能安排执行
throws NullPointerException
如果参数tasknull

7、invokeAll方法

@NotNull <T> List<Future<T>> invokeAll(@NotNull Collection<? extends Callable<T>> tasks) throws InterruptedException;

执行给定的任务,返回一个Futures列表,在所有完成后,保存它们的状态和结果。FutureisDone遍历返回列表的每个元素是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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语生词本

英语生词本 1、daemon [di:mən] 守护进程2、phase [英] [feiz] 阶段, 时期3、methodology [英] [ˌmeθəˈdɔlədʒi:] 方法学,方法论4、algorithmalgorithm [英] [ˈlɡəriəm] [美] [ˈlɡəˌrɪəm] 运算法则2. 算法&#xff1b;演算法&#xff1b;计算程序3. 演示5、…

Executors源码解读——创建ExecutorService线程池

Executors源码解读——创建ExecutorService线程池〇、[源码版本] jdk 1.8一、线程池概述二、线程池创建三、Executors源码解读newFixedThreadPool()newWorkStealingPool()newSingleThreadExecutor()newCachedThreadPool()newSingleThreadScheduledExecutor()〇、[源码版本] jdk…

《大话设计模式》读书笔记-索引

《大话设计模式》读书笔记-第1章 简单工厂模式 《大话设计模式》读书笔记-第2章 策略模式 《大话设计模式》读书笔记-第3章 单一职责原则 《大话设计模式》读书笔记-第4章 开放-封闭原则 《大话设计模式》读书笔记-第5章 依赖倒转原则 《大话设计模式》读书笔记-第6章 装饰模式…

Future源码解读

Future源码解读〇、[源码版本] jdk 1.8一、Future概述[举例1]示例代码[举例2]示例代码内存一致性影响二、Future接口的方法cancel方法isCancelled方法isDone方法get方法〇、[源码版本] jdk 1.8 一、Future概述 Future表示异步计算的结果。提供了检查计算是否完成、等待计算完…

RIP,EIGRP,OSPF融合网络互通实验(原创)

首先看拓扑&#xff1a; 一个面试考官问我一个这样的问题&#xff0c;拓扑如上&#xff0c;为什么R1上的lo0 PING 不通 R6 上的lo0,说是一切都按正常配置&#xff0c;说是考我EIGRP的特性。我当然很纳闷&#xff0c;如果都正常配置怎么会不通呢&#xff0c;最后他告诉我主要是考…

谷歌A/B实验——重叠实验基础设施解读

谷歌A/B实验——重叠实验基础设施解读〇、来源一、背景介绍二、如何划分参数三、谷歌设计的ab实验系统3.1 域和层的设计3.1.1 基础重叠域和层设计3.1.2 具备非重叠和重叠的域和层设计3.1.2 具备非重叠的域的嵌套设计优点3.1.3 具备非重叠的域的嵌套设计缺点3.1.4 启动层&#x…

oracle 备份

1.首先以 sysdba的身份登录数据库 SQL> conn sys/oracle as sysdba SQL> col name for a50 SQL> select * from v$controlfile; 找到控制文件所在目录 STATUS ------- NAME --------------------------------------- F:\ORACLE\ORADATA\AFIS40\CONTROL01.CTL F:\O…

Mysql 5.7 创建索引官方解读

一、环境 Mysql 5.7 二、Mysql索引创建解读 1.概述 通常我们在使用CREATE TABLE时会创建所有的索引。索引的创建对于 InnoDB 表尤其重要&#xff0c;其中主键决定了数据文件中行的物理布局。 CREATE INDEX是另一种添加索引的方式&#xff0c;针对已经创建的表添加索引。注…

ntp时间服务解析

网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是用于互联网中时间同步的标准互联网协议。NTP的用途是把计算机的时间同步到某些时间标准。目前采用的时间标准是世界协调时UTC&#xff08;Universal Time Coordinated&#xff09;。NTP的主要开发者是美国特拉华…

java循环中list.add对象的坑——后加入元素覆盖早期数据成相同值问题

原因 list.add&#xff08;对象&#xff09;&#xff0c;放入的实质是对象的引用。当对象在循环外进行new后&#xff0c;第一次循环add对象1&#xff0c;第二次循环add对象2&#xff0c;由于放入实质是对象的引用&#xff0c;引用指向了对象2&#xff0c;故变成list里有两个对…

AspectJ切面自定义注解实现参数分组校验——基础概念(1)

AspectJ切面自定义注解实现参数分组校验——基础概念&#xff08;1&#xff09;一、环境二、validation-api源码解读2-1.Default源码解读2-2.valid源码解读2-3.Validation源码解读一、环境 maven 需要引入的依赖&#xff1a; <dependency><groupId>javax.valida…

【注册机】ColorSchemer Studio 2.1.0 注册机

下载地址&#xff1a;http://files.cnblogs.com/boringlamb/keygencs.rar转载于:https://www.cnblogs.com/boringlamb/archive/2010/09/01/1815264.html

AspectJ切面自定义注解实现参数分组校验——基础概念(2)

AspectJ切面自定义注解实现参数分组校验——基础概念&#xff08;2&#xff09;一、环境二、创建AspectJ2-1.基础概念2-2.Pointcut规则表达式2-3.切点标志符pointcut designator (PCD)1&#xff09;execution2&#xff09;within3&#xff09;this和target4&#xff09;args5&a…

5230主题下载

最近朋友买了新手机&#xff0c;可是她又是电脑白痴&#xff0c;告诉她要她用百度搜&#xff0c;硬是没找到&#xff0c;百般无奈我千挑万选&#xff0c;找到了这个网站&#xff0c;让方便也同样带给同样不知道怎么用百度的朋友了5230主题下载网址&#xff1a;http://d.958shop…

AspectJ切面自定义注解实现参数分组校验——代码实现(3)

AspectJ切面自定义注解实现参数分组校验——代码实现&#xff08;3&#xff09;一、环境1-1.备注二、代码实现2-1.注解定义2-2.组定义2-3.constraints使用2-4.切面定义2-5.复用ValidatorFactory2-6.单测校验2-7.说明一、环境 springbootmaven <dependency><groupId&…

solaris下修改 IPMP 配置

使用 IPMP 配置文件 /etc/default/mpathd 为 IPMP 组配置以下系统范围的参数。 FAILURE_DETECTION_TIME TRACK_INTERFACES_ONLY_WITH_GROUPS FAILBACK 如何配置 /etc/default/mpathd 文件 在具有 IPMP 组配置的系统上&#xff0c;承担主管理员角色或成为超级用户。 主管理员角色…

电力自动化及继电保护实验室规章制度

为了按时完成电力自动化及继电保护实验&#xff0c;确保实验时人身安全与设备安全&#xff0c;要严格遵守如下规定的安全操作规程 一、 仔细阅读实验指导书内容&#xff0c;严格按实验指导书中的步骤来做试验。 二、 实验时&#xff0c;人体不可接触带电线路。 三、 接线或拆线…

主板跳线连接技巧图解

作为一名新手&#xff0c;要真正从头组装好自己的电脑并不容易&#xff0c;也许你知道CPU应该插哪儿&#xff0c;内存应该插哪儿&#xff0c;但遇到一排排复杂跳线的时候&#xff0c;很多新手都不知道如何下手。 钥匙开机其实并不神秘 还记不记得你第一次见到装电脑的时候…

几个不同的概念

站点 虚拟目录2个是不同德概念。站点需要应用程序池去生效。转载于:https://blog.51cto.com/vaxvax0000/390912

VMWARE双机安装说明

详见附件。 开始创建第一台机器&#xff1a;WIN2003 NODE1这里虚拟硬盘可以尽量选择大点,然后点“完成”进行创建就OK了。配置NODE1&#xff1a;把内存调整到256M以上&#xff0c;然后点“Add”增加一块网卡&#xff1a;网卡添加完后&#xff0c;再点“Add” 添加共享磁盘&…