ThreadPoolExecutor 线程池的使用
1.状态
状态 | 描述 |
RUNNING | 允许提交新的任务处理 |
SHUTDOWN | 不允许提交了,但是已提交的会继续执行完 |
STOP |
不允许提交新的任务,也不会处理阻塞队列中未执行的任务,并设置正在执行的线程的中断标志位 |
TIDYING | 所有任务执行完毕,池中工作的线程数为0,等待执行terminated()勾子方法 |
TERMINATED | 执行了销毁 |
2.构造
参数含义:
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
拒绝策略:
/*** new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人的,抛出异常* new ThreadPoolExecutor.CallerRunsPolicy() //哪来的去哪里!* new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常!* new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试和最早的竞争,也不会抛出异常*/
原理:
实际上,线程池ThreadPoolExecutor的提交方法,即execute(),就是按照这三个阶段执行的。提交分3步:首先,判断线程数是否小于核心线程数,如果小于,则立即创建一个worker(内部类)并且直接把任务传入新创建的worker(任务不会进入阻塞队列),立即启动worker线程,函数返回;然后,若线程数大于核心线程数,则尝试把任务放入阻塞队列,如果成功则需要再判断一下线程池的状态是否为SHUTDOWN,并且也要判断一下worker线程数是否又变成0。如果变成SHUTDOWN,则需要把刚刚放入队列的任务拿出队列(因为突然发生的shutdown()调用),然后执行按照饱和策略处理(给handler)。如果线程数变成0,则需要重新再创建一个worker线程(刚才检查过的核心线程正好挂掉,如果不创建worker则线程池此时进入静止状态);最后,如果放入阻塞队列失败,则创建非核心worker线程处理该任务。如果这个操作也失败,则把任务交给饱和策略(handler)处理。
样例代码:
public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 20, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), new ThreadPoolExecutor.CallerRunsPolicy());for (int i = 0; i < 10; i++) {System.out.println("执行第"+i);threadPoolExecutor.execute(()->{try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}});}threadPoolExecutor.shutdown();threadPoolExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);}
ThreadPoolExecutor 线程池的使用相关推荐
- ThreadPoolExecutor线程池,shutdown和shutdownNow关闭线程池方式对比,以及确保线程池能够彻底关闭的一种方式
1. ThreadPoolExecutor线程池 1.1 创建线程池,构造方法的几个参数说明及创建如下. 1.2 shutdown方式关闭线程池 a. 空闲且能interrupt表示该线程处于阻塞等待 ...
- 13.ThreadPoolExecutor线程池之submit方法
jdk1.7.0_79 在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...
- Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码【一万字】
基于JDK1.8详细介绍了ThreadPoolExecutor线程池的execute方法源码! 上一篇文章中,我们介绍了:Java Executor源码解析(2)-ThreadPoolExecutor ...
- ThreadPoolExecutor线程池核心参数详解
理解ThreadPoolExecutor线程池的corePoolSize.maximumPoolSize和poolSize 我们知道,受限于硬件.内存和性能,我们不可能无限制的创建任意数量的线程,因为 ...
- 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理
摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...
- ThreadPoolExecutor线程池原理
ThreadPoolExecutor线程池原理 线程池原理 1. 线程池的简单介绍 1.1 线程池是什么 1.2 线程池解决的核心问题是什么 2. 线程池的实现原理 2.1 线程池的执行流程 2.2 ...
- ThreadPoolExecutor 线程池和redisson加上手动事务踩的坑
ThreadPoolExecutor 线程池和redisson加上手动事务踩的坑 一.具体活动 0.线程池 1.redisson锁 依赖 2.redisson锁 config文件 3.redisson ...
- ThreadPoolExecutor(线程池)的参数
构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit u ...
- 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )
文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...
- ThreadPoolExecutor线程池的理解与应用
一.线程池与进程池的区别 两个关键词:线程,进程/池 池:可以将其理解为一种容器,有其固定的大小 什么时候用线程池/进程池,分两个问题讨论 1.什么时候用池:当程序中的任务并发数远远大于计算机的承受能 ...
最新文章
- java一个接口执行结束释放内存_java的灵魂--JVM虚拟机
- jenkins pipeline api获取stage的详细信息_Jenkins + Docker 助力 Serverless 应用构建与部署...
- 【剑指offer】_17正则表达式的匹配
- 前端学习(2759):button按钮使用
- 主机ping不通Virtualbox里的虚拟机
- 心动的本质是什么_那一刻,我怦然心动了......
- Testng.xml文件讲解
- Spring day03笔记
- python求解简单加密问题,实现对输入的密文加密
- 数据中心服务器巡检方案,数据中心巡检机器人方案.pdf
- Win11快捷键大全
- 自己制作并发布720°VR全景图
- centos下压缩文件7z解压
- USB、MiniUSB、MicroUSB
- java中import是什么意思_java中import关键字是什么意思
- 浅谈移动端图片压缩(iOS Android)
- python基础之写文件操作
- 海外博士/博士后职位网站汇总
- 正则:element ui input只能输入数字及数字后两位
- 用NXP官方开发工具S32调试kea128流程(用官方例程以及固件库)
热门文章
- TCP协议基于计时器的重传策略模拟实战
- android 电话回音消除,智能门铃中可视对讲的回音消除
- 怎样对计算机实现远程关机,计算机实验室如何实现远程关机.pdf
- scite php配置 下载,SciTE 的配置记录
- 全国高校计算机年会,第19届全国离散智能计算年会在我校举行
- oppo修改无线网服务器,简单小修改,你的OPPO手机wifi信号会马上提升
- 【Python】flask框架学习 flask框架的基本使用
- 腾讯云从业者资格认证考试模拟题1
- 视频教程-OpenGL入门2019版-其他
- Ubuntu系统安装微信(解决高分辨率屏幕问题及图标显示问题)