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 线程池的使用相关推荐

  1. ThreadPoolExecutor线程池,shutdown和shutdownNow关闭线程池方式对比,以及确保线程池能够彻底关闭的一种方式

    1. ThreadPoolExecutor线程池 1.1 创建线程池,构造方法的几个参数说明及创建如下. 1.2 shutdown方式关闭线程池 a. 空闲且能interrupt表示该线程处于阻塞等待 ...

  2. 13.ThreadPoolExecutor线程池之submit方法

    jdk1.7.0_79  在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...

  3. Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码【一万字】

    基于JDK1.8详细介绍了ThreadPoolExecutor线程池的execute方法源码! 上一篇文章中,我们介绍了:Java Executor源码解析(2)-ThreadPoolExecutor ...

  4. ThreadPoolExecutor线程池核心参数详解

    理解ThreadPoolExecutor线程池的corePoolSize.maximumPoolSize和poolSize 我们知道,受限于硬件.内存和性能,我们不可能无限制的创建任意数量的线程,因为 ...

  5. 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

    摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...

  6. ThreadPoolExecutor线程池原理

    ThreadPoolExecutor线程池原理 线程池原理 1. 线程池的简单介绍 1.1 线程池是什么 1.2 线程池解决的核心问题是什么 2. 线程池的实现原理 2.1 线程池的执行流程 2.2 ...

  7. ThreadPoolExecutor 线程池和redisson加上手动事务踩的坑

    ThreadPoolExecutor 线程池和redisson加上手动事务踩的坑 一.具体活动 0.线程池 1.redisson锁 依赖 2.redisson锁 config文件 3.redisson ...

  8. ThreadPoolExecutor(线程池)的参数

    构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit u ...

  9. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  10. ThreadPoolExecutor线程池的理解与应用

    一.线程池与进程池的区别 两个关键词:线程,进程/池 池:可以将其理解为一种容器,有其固定的大小 什么时候用线程池/进程池,分两个问题讨论 1.什么时候用池:当程序中的任务并发数远远大于计算机的承受能 ...

最新文章

  1. java一个接口执行结束释放内存_java的灵魂--JVM虚拟机
  2. jenkins pipeline api获取stage的详细信息_Jenkins + Docker 助力 Serverless 应用构建与部署...
  3. 【剑指offer】_17正则表达式的匹配
  4. 前端学习(2759):button按钮使用
  5. 主机ping不通Virtualbox里的虚拟机
  6. 心动的本质是什么_那一刻,我怦然心动了......
  7. Testng.xml文件讲解
  8. Spring day03笔记
  9. python求解简单加密问题,实现对输入的密文加密
  10. 数据中心服务器巡检方案,数据中心巡检机器人方案.pdf
  11. Win11快捷键大全
  12. 自己制作并发布720°VR全景图
  13. centos下压缩文件7z解压
  14. USB、MiniUSB、MicroUSB
  15. java中import是什么意思_java中import关键字是什么意思
  16. 浅谈移动端图片压缩(iOS Android)
  17. python基础之写文件操作
  18. 海外博士/博士后职位网站汇总
  19. 正则:element ui input只能输入数字及数字后两位
  20. 用NXP官方开发工具S32调试kea128流程(用官方例程以及固件库)

热门文章

  1. TCP协议基于计时器的重传策略模拟实战
  2. android 电话回音消除,智能门铃中可视对讲的回音消除
  3. 怎样对计算机实现远程关机,计算机实验室如何实现远程关机.pdf
  4. scite php配置 下载,SciTE 的配置记录
  5. 全国高校计算机年会,第19届全国离散智能计算年会在我校举行
  6. oppo修改无线网服务器,简单小修改,你的OPPO手机wifi信号会马上提升
  7. 【Python】flask框架学习 flask框架的基本使用
  8. 腾讯云从业者资格认证考试模拟题1
  9. 视频教程-OpenGL入门2019版-其他
  10. Ubuntu系统安装微信(解决高分辨率屏幕问题及图标显示问题)