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

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

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

〇、[源码版本] jdk 1.8

一、线程池概述

1)线程的创建需要操作线程资源、栈空间等,大量且频繁的创建与销毁需要消耗大量时间。

2)使用线程池处理,就可以复用一组线程,把一小组任务交给线程池分发处理。

3)线程池内维护了若干数量的线程:
a.没有任务时候,这些线程处于等待状态
b.有新任务,就分配一个空闲的线程执行
c.若所有线程处于忙碌状态,新任务要么放入队列等待,要么增加一个新线程进行处理。

二、线程池创建

ExecutorService是接口,它常用的创建方式可以通过Executors的方法来创建。
在这里插入图片描述

三、Executors源码解读

为这些对象提供工厂和实用方法:在concurrent包中定义的ExecutorExecutorServiceScheduledExecutorServiceThreadFactoryCallable类。

提供的方法返回结果类型有:
a.常规配置的ExecutorService
b.常规配置的ScheduledExecutorService
c.禁止修改配置的封装后的ExecutorService
(d.将新创建的线程设置为已知状态的ThreadFactory
(e.在其他类似封闭(closure-like)的形式以外的Callable
本文主要讨论前三种。

newFixedThreadPool()

public static ExecutorService newFixedThreadPool(int nThreads)

Executors创建一个线程池,该线程池复用固定数量的线程,线程操作在共享的无界队列。在任何时候,最多nThreads个线程将正在运行处理任务。

如果在所有线程都处于忙碌状态时,提交了其他任务,它们将在队列中等待,直到有线程可用。

如果任何线程因执行期间的失败而终止,且在关闭之前,如果后续任务需要执行,一个新线程将取而代之。

池中的线程会一直存在,直到明确调用ExecutorServiceshutdown方法。

a.参数:
nThreads 池中的线程数
b.返回:
ExecutorService 新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads个数小于等于0时

newWorkStealingPool()

public static ExecutorService newWorkStealingPool(int parallelism)

创建一个线程池,它维持足够的线程来支持给定的并行度级别parallelism,并且可能会使用多个队列来减少争用。

并行度级别对应于最大的活跃线程参与数量、或可用于参与任务处理的线程数。线程的实际数量可能动态增长和收缩。work-stealing线程池不保证提交任务的执行顺序。

a.参数:
parallelism 目标并行度级别
b.返回:
ExecutorService 新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads个数小于等于0时

public static ExecutorService newWorkStealingPool()

创建一个work-stealing线程池,使用所有Runtime中的availableProcessors(可用处理器)作为其目标并行度级别。

a.参数:无
b.返回:
ExecutorService 新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads个数小于等于0时

newSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor()

创建一个使用单个工作线程无界队列中操作的Executor

请注意,如果这个单个线程由于在关闭之前的执行过程中失败而终止,如果后续任务需要执行,一个新线程将取而代之。

会保证任务按顺序执行,并且不超过一个任务,在任何给定时间内处于活跃状态。与其他等效的newFixedThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程

a.参数:无
b.返回:
ExecutorService 新创建的线程池
c.异常:无

newCachedThreadPool()

public static ExecutorService newCachedThreadPool()

创建一个线程池,根据需要创建线程,但之前构建的线程可用时会复用它们。这些线程池通常会提高程序(execute执行许多短期异步任务的)的性能。

调用execute将复用先前构造的线程(如果可用)。如果没有可用的现有线程,则会创建一个新的线程并将其添加到线程池中。

60 秒内未使用的线程将被终止并从缓存中移除。因此,保持空闲足够长时间的线程池将不会消耗任何资源。

请注意,可以使用ThreadPoolExecutor构造函数创建具有相似属性但不同细节(例如,超时参数)的池。

a.参数:无
b.返回:
ExecutorService 新创建的线程池
c.异常:无

newSingleThreadScheduledExecutor()

public static ScheduledExecutorService newSingleThreadScheduledExecutor()

创建一个单线程执行器executor,它可以安排命令在给定的延迟后运行,或定期执行

但是请注意,如果这个单一的线程在关闭之前的执行过程中由于失败而终止,如果后续任务需要执行,一个新的线程将取而代之。

会保证任务按顺序执行,并且不超过一项任务将在任何给定时间处于活跃状态。与其他等效的newScheduledThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程

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

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

相关文章

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

《大话设计模式》读书笔记-第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融合网络互通实验(原创)

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

谷歌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 表尤其重要,其中主键决定了数据文件中行的物理布局。 CREATE INDEX是另一种添加索引的方式,针对已经创建的表添加索引。注…

ntp时间服务解析

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

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

原因 list.add(对象),放入的实质是对象的引用。当对象在循环外进行new后,第一次循环add对象1,第二次循环add对象2,由于放入实质是对象的引用,引用指向了对象2,故变成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” 添加共享磁盘&…

GridView 中 Bind和Eval的区别详解

Eval()方法在运行时使用反射执行后期绑定计算&#xff0c;因此与标准的ASP.NET数据绑定方法bind相比&#xff0c;会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法 Eval 方法是静态&#xff08;只读&#xff09;方法&#xff0c;该方法采…

为什么每个线程都需要创建一个栈?

有四个函数A、B、C、D&#xff0c;地址分别为100、200、300、400&#xff1b;有两个线程同时执行&#xff1b; 1&#xff09;假如只有一个栈 函数A在线程1中执行的时候&#xff0c;调用了函数B&#xff0c;将函数A中下一条指令的地址入栈&#xff08;104&#xff09;&#xff…