ThreadPoolExecutor线程池
文章目录
- 一、ThreadPool线程池状态
- 二、ThreadPoolExecutor构造方法
- 三、Executors
- 3.1 固定大小线程池
- 3.2 带缓冲线程池
- 3.3 单线程线程池
- 四、ThreadPoolExecutor
- 4.1 execute(Runnable task)方法使用
- 4.2 submit()方法
- 4.3 invokeAll()
- 4.4 invokeAny()
- 4.5 shutdown()
- 4.6 shutdownNow()
- 总结
一、ThreadPool线程池状态

ThreadPoolExecutor使用int的高3位来表示线程池状态,低29位表示线程数量

从数字上比较,TERMINATED>TIDYING>STOP>SHUTDOWN>RUNNING,最高的1位是1是代表的是负数
这些信息存储在一个原子变量ctl中,目的是将线程池状态与线程个数合二为一,这样就可以用一次CAS原子操作进行赋值
c为旧值,ctlOf返回结果为新值
ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))))
rs(running state)为高3位代表线程池状态 wc(worker count) 为低29位代表线程个数
private static int ctlOf(int rs,int wc){return rs | wc;}
二、ThreadPoolExecutor构造方法
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
ThreadPoolExecutor7大核心参数
corePoolSize:核心线程数目(最多保留的线程数)
maximumPoolSize:最大线程数目
keepAliveTime:生存时间(针对非核心线程)
unit:时间单位(针对非核心线程)
workQueue:阻塞队列
threadFactory:线程工厂
handler:拒接策略
非核心线程数=maximumPoolSize-corePoolSize
拒绝策略
- AbortPolicy:让调用者抛出RejectedException异常(
默认拒绝策略) - CallerRunsPolicy:让调用者运行任务
- DiscardPolicy:放弃本次任务
- DiscardOldestPolicy:放弃队列中最早的任务,本任务会取而代之
三、Executors
3.1 固定大小线程池
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}
特点
核心线程数=最大线程数,因此不需要超时时间- 阻塞队列是无界的,可以放任意数量的任务
3.2 带缓冲线程池
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}
特点
1. 核心线程=0,最大线程数=Integer的最大值,非核心线程空闲的生存时间是60S
2. 全员都是非核心线程
3. 非核心线程可以无线创建
4. SynchronousQueue实现特点,它没有容量,没有线程来取是放不进去的(一手交钱,一手交货)
3.3 单线程线程池
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}
区别
- 自己创建一个单线程串行执行任务,如果执行任务失败而终止那么没有任何补救措施,而线程池还会重新创建一个线程,保证线程池的工作
四、ThreadPoolExecutor
4.1 execute(Runnable task)方法使用
特点:execute(Runnable task)方法执行后不会返回结果,若我们执行完方法后需要结果进行运算则不适用
public static void main(String[] args) throws Exception{ExecutorService pool = Executors.newFixedThreadPool(1);//方式一pool.execute(new Runnable() {@Overridepublic void run() {//执行的业务逻辑}});//方式二:使用lambda表达式简化pool.execute(() -> {//执行的业务逻辑});}
4.2 submit()方法
特点:我们执行完submit方法后可以将处理结果进行返回
public static void main(String[] args) throws Exception{ExecutorService pool = Executors.newFixedThreadPool(1);//方式一Future<返回结果类型> taskResult=pool.submit(new Callable<返回结果类型>() {@Overridepublic 返回结果类型 call() {//执行的业务逻辑,后将处理结果返回return null;}});//拿到返回的结果taskResult.get();//方式二:使用lambda表达式简化Future<返回结果类型> taskResult=pool.submit(() -> {//执行的业务逻辑return null;});//拿到返回的结果taskResult.get();}
4.3 invokeAll()
特点:执行任务以集合的方式,并且返回结果集合
public static void main(String[] args) throws Exception{ExecutorService pool = Executors.newFixedThreadPool(1);List<Future<Object>> tasks = pool.invokeAll(Arrays.asList(() -> {//执行逻辑返回结果return 1;},() -> {//执行逻辑返回结果return 2;}));for (Future<Object> task : tasks) {System.out.println(task.get());}}
4.4 invokeAny()
特点:将任务集合中所有的任务进行执行,只返回第一个执行完毕的任务结果
Integer res = pool.invokeAny(Arrays.asList(() -> {return 1;},() -> {return 2;}));System.out.println(res);
4.5 shutdown()
特点:
- 将线程池状态变为
SHUTDOWN
- 不会接受新任务
- 但已提交的任务会执行完
- 此方法不会阻塞调用线程的执行
4.6 shutdownNow()
特点:
- 线程池状态变为
STOP
- 不会接收新任务
- 会将队列中的任务返回
- 并用interrupt的方式终端正在执行的任务
总结
完
相关文章:
ThreadPoolExecutor线程池
文章目录 一、ThreadPool线程池状态二、ThreadPoolExecutor构造方法三、Executors3.1 固定大小线程池3.2 带缓冲线程池3.3 单线程线程池 四、ThreadPoolExecutor4.1 execute(Runnable task)方法使用4.2 submit()方法4.3 invokeAll()4.4 invokeAny()4.5 shutdown()4.6 shutdownN…...
chatgpt赋能python:Python实践:如何升级pip
Python实践:如何升级pip Python作为一门高效的脚本语言,被广泛应用于数据分析、人工智能、Web开发等领域。而pip则是Python的包管理工具,是开发Python应用的必备工具。但是pip在使用过程中,有时候会出现版本不兼容或者出现漏洞等…...
【JavaEE进阶】mybatis
目录: 一、Mybatis是什么 三个映射关系如下图: 二、mybatis的使用(前置工作简单案例) 第一步:导入MAVEN依赖 第二步: 在spring项目当中新建数据源 第三步:新建一个实体类,是和…...
Redis的大key
什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值,而是该 key 所对应的 value 过大对于 string 类型来说,一般情况下超过 10KB 则认为是大 key;对于set、zset、hash 等类型来说,一般…...
MMPretrain
title: mmpretrain实战 date: 2023-06-07 16:04:01 tags: [image classification,mmlab] mmpretrain实战 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccTl9bOl-1686129437336)(null)] 主要讲解了安装,还有使用教程.安装教程直接参考官网.下面讲…...
栈和队列(数据结构刷题)[一]-python
文章目录 前言一、原理介绍二、用栈实现队列1.操作2.思路 三、关于面试考察栈里面的元素在内存中是连续分布的么? 前言 提到栈和队列,大家可能对它们的了解只停留在表面,再深入一点,好像知道又好像不知道的感觉。本文我将从底层实…...
【备战秋招】JAVA集合
集合 前言 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要 对对象进行存储。 另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多…...
setState详解
this. setState( [partialState], [callback]) 1.[partialState] :支持部分状态更改 this, setState({ x:100 //不论总共有多少状态,我们只修改了x,其余的状态不动 });callback :在状态更改/视图更新完毕后触发执行,也可以说只要执行了setS…...
Qt5.12.6配置Android Arm开发环境(windows)
1. 安装jdk1.8 2.安装Android Studio 并安装 SDK 与NDK SDK Tools 选择 26.0.3 SDK Platform 选择 Android SDK Platform 26 NDK选择19版本 安卓ARM环境配置成功如下: JDK1.8 , SDK 26 , NDK 19 在安装QT时要选择 ARMv7(32位CPU)与ARM64-v8a(64位CPU) 选择支持android平台…...
七、进程程序替换
文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…...
C++核心编程——详解运算符重载
文章目录💬 一.运算符重载基础知识①基本概念②运算符重载的规则③运算符重载形式④运算符重载建议 二.常用运算符重载①左移(<<)和右移(>>)运算符重载1️⃣重载后函数参数是什么?2️⃣重载的函数返回类型是什么?3️⃣重载为哪种…...
2023年前端面试汇总-CSS
1. CSS基础 1.1. CSS选择器及其优先级 对于选择器的优先级: 1. 标签选择器、伪元素选择器:1; 2. 类选择器、伪类选择器、属性选择器:10; 3. id 选择器:100; 4. 内联样式:1000&a…...
Java调用Pytorch实现以图搜图(附源码)
Java调用Pytorch实现以图搜图 设计技术栈: 1、ElasticSearch环境; 2、Python运行环境(如果事先没有pytorch模型时,可以用python脚本创建模型); 1、运行效果 2、创建模型(有则可以跳过…...
【EasyX】实时时钟
目录 实时时钟1. 绘制静态秒针2. 秒针的转动3. 根据实际时间转动4. 添加时针和分针5. 添加表盘刻度 实时时钟 本博客介绍利用EasyX实现一个实时钟表的小程序,同时学习时间函数的使用。 本文源码可从github获取 1. 绘制静态秒针 第一步定义钟表的中心坐标center&a…...
基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)
GMSL 图像采集卡 特性 ● PCIe Gen2.0 X8 总线; ● 支持V4L2调用; ● 1路CAN接口; ● 6路/12路 GMSL1/2摄像头输入,最高可达8MP; ● 2路可定义相机同步触发输入/输出; 优势 ● 采用PCIe主卡与FMC子…...
Kibana:使用 Kibana 自带数据进行可视化(一)
在今天的练习中,我们将使用 Kibana 自带的数据来进行一些可视化的展示。希望对刚开始使用 Kibana 的用户有所帮助。 前提条件 如果你还没有安装好自己的 Elastic Stack,你可以参考如下的视频来开启 Elastic Stack 并进行下面的练习。你可以开通阿里云检…...
MySQL数据库基础 07
第七章 单行函数 1. 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数及分类 2. 数值函数2.1 基本函数2.2 角度与弧度互换函数2.3 三角函数2.4 指数与对数2.5 进制间的转换 3. 字符串函数4. 日期和时间函数4.1 获取日期、时间 4.2 日期与时间戳的转换 4.3 获…...
JVM | JVM垃圾回收
JVM | JVM垃圾回收 1、堆空间的基本结构2、内存分配和回收原则2.1、对象优先在 Eden 区分配2.2、大对象直接进入老年代2.3、长期存活的对象将进入老年代2.4、主要进行 gc 的区域2.5、空间分配担保3、死亡对象判断方法3.1、引用计数法3.2、可达性分析算法3.3、引用类型总结3.4、…...
avive零头撸矿
Avive 是一个透明的、自下而上替代自上而下的多元网络,旨在克服当前生态系统的局限性,实现去中心化社会。 aVive:一个基于 SBT 和市场的 deSoc,它使 dapps 能够与分散的位置 oracle 和 SBT 关系进行互操作。您的主权社交网络元宇宙…...
openGauss5.0之学习环境 Docker安装
文章目录 0.前言1. 准备软硬件安装环境1.1 软硬件环境要求1.2 修改操作系统配置1.2.1 关闭操作系统防火墙 1.3 设置字符集参数1.4 设置时区和时间(可选)关闭swap交换内存1.5 关闭RemoveIPC1.6 关闭HISTORY记录 2. 容器安装2. 1支持的架构和操作系统版本2…...
Stable Diffusion像素艺术工作站实战:Pixel Fashion Atelier Forge Scale调优指南
Stable Diffusion像素艺术工作站实战:Pixel Fashion Atelier Forge Scale调优指南 1. 像素时装锻造坊简介 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站,专为像素艺术创作而设计。与传统AI工具不同,它采…...
Wemod-Patcher:开源工具实现WeMod功能增强的完整方案
Wemod-Patcher:开源工具实现WeMod功能增强的完整方案 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 在游戏体验优化领域࿰…...
ai辅助开发:基于快马平台为trea国际版添加汇率数据智能分析功能
最近在开发Trea国际版应用时,遇到了一个需求:如何让用户更直观地理解汇率波动趋势,并通过自然语言交互获得分析结果。这个功能看似复杂,但借助InsCode(快马)平台的AI辅助开发能力,整个过程变得异常简单。下面分享我的实…...
为什么你的BUCK电路不稳定?峰值电流模式Fm增益的5个关键影响因素
为什么你的BUCK电路不稳定?峰值电流模式Fm增益的5个关键影响因素 在电源设计领域,BUCK电路的稳定性问题一直是工程师们头疼的难题。尤其是采用峰值电流模式控制的BUCK转换器,其调制器增益Fm的合理设置直接关系到整个系统的动态响应和稳定性。…...
百度网盘提取码智能获取:3分钟解锁加密资源的秘密武器
百度网盘提取码智能获取:3分钟解锁加密资源的秘密武器 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘上那些需要提取码的资源而烦恼吗?每次遇到心仪的学习资料、软件工具或影视资源&…...
终极scan4all安全扫描工具:如何生成专业日志分析与安全评估报告
终极scan4all安全扫描工具:如何生成专业日志分析与安全评估报告 【免费下载链接】scan4all 项目地址: https://gitcode.com/gh_mirrors/sc/scan4all scan4all是一款功能强大的自动化安全扫描工具,它集成了vscan、nuclei、ksubdomain、subfinder等…...
从‘文化进化’到AI调参:Memetic算法在机器学习超参数优化中的实战指南
Memetic算法:机器学习超参数优化的进化革命 当你的神经网络在验证集上表现停滞不前,当XGBoost的网格搜索消耗了三天三夜却收效甚微,或许该换个视角看待调参这个"玄学"问题了。Memetic算法——这个融合了达尔文进化论与文化传播智慧…...
学术专著不用愁!AI专著生成工具,高效打造专业学术精品
学术专著的魅力在于其逻辑严谨性,但在写作过程中,逻辑推理常常是最容易出现问题的部分。创作专著需要围绕核心观点进行系统的论证,不仅要对每个论点进行详细阐述,还需要处理不同学派之间的争论,确保整个框架逻辑自洽&a…...
ChatTTS在线测试实战:从模型部署到性能调优全解析
最近在折腾一个在线语音合成的测试服务,用到了 ChatTTS 这个模型。想把模型部署上线,提供个 Web 服务给大家测试用,听起来简单,但真做起来,发现坑还真不少。今天就把我这一路从部署、调优到填坑的实战经验整理一下&…...
从八股到实战!3月25日Python高并发面试,TaskGroup+JIT双杀通关
面试官推了推眼镜,盯着你的简历:“说说Python高并发吧,asyncio用过吗?” 你心里冷笑一声。这要是搁三年前,你肯定开始背诵:"asyncio是Python的异步IO库,使用事件循环机制,通过a…...
