当前位置: 首页 > news >正文

ThreadPoolExecutor的执行流程和拒绝策略

一、执行流程

ThreadPoolExecutor是Java标准库的线程池,Executors本质上是对其进行封装后的类。

先来认识一下ThreadPoolExecutor的构造方法:

ThreadPoolExecutor的构造方法
ThreadPoolExecutor(int corePoolSize,  int maximumPoolSize,  long keepAliveTime,  TimeUnit unit,  BlockingQueue<Runnable> workQueue)
ThreadPoolExecutor(int corePoolSize,  int maximumPoolSize,  long keepAliveTime,  TimeUnit unit,  BlockingQueue<Runnable> workQueue,  ThreadFactory)
ThreadPoolExecutor(int corePoolSize,  int maximumPoolSize,  long keepAliveTime,  TimeUnit unit,  BlockingQueue<Runnable> workQueue,  RejectedExecutionHandler)
ThreadPoolExecutor(int corePoolSize,  int maximumPoolSize,  long keepAliveTime,  TimeUnit unit,  BlockingQueue<Runnable> workQueue,  ThreadFactory,  RejectedExecutionHandler)

我们主要看一下最后一个构造方法,这个方法的参数是最为齐全的~

参数一:int corePoolSize

表示线程池的核心线程数量,核心线程即使处于空闲状态也不会被销毁。

参数二:int maximumPoolSize

表示线程池的最大线程数量,最大线程数量 = 核心线程数 + 临时线程数;临时线程处于空闲状态达到一定时间,就会被销毁。

参数三:long keepAliveTime

表示临时线程可以处于空闲状态的最长时间。

参数四:TimeUnit unit

表示参数三的时间单位 ,可以设置为纳秒、微秒、毫秒、秒、分钟等单位。

参数五:BlockingQueue<Runnable> workQueue

给线程池传入一个工作队列。

参数六:ThreadFactory

ThreadFactory是一个接口,描述了线程的创建方式,我们可以通过ThreadFactory对象手动来指定如何创建线程。

参数七:RejectedExecutionHandler

表示线程池的拒绝策略,下面会详细说~

示例:创建一个核心线程数为5,最大线程数为10,任务队列容量为100的线程池

认识了构造方法,我们才能理解它的执行流程~

ThreadPoolExecutor的执行流程是这样的:

1、当线程池中新加入一个任务时,先判断核心线程数是否达到最大值,如果为false则创建一个核心线程执行任务,如果为true执行第二步;

2、判断当前任务队列是否已满,如果为false,则将任务加入到队列中等待执行;如果为true,则判断当前线程数是否达到最大线程数;

3、如果当前线程数没有达到最大线程数,则创建临时线程来执行任务,如果达到最大线程数,则执行拒绝策略。

二、拒绝策略

从上图可以看出,拒绝策略指的是线程池中线程数量达到最大值,任务队列为满时,来了新任务的处理方式。

标准库中提供了以下几种拒绝策略:

1、ThreadPoolExecutor.AbortPolicy

抛出一个RejectedExecutionException异常来拒绝执行任务:

2、ThreadPoolExecutor.CallerRunsPolicy

新加入的任务由线程池的调用线程来执行;

如果调用线程被销毁了,那么新加入的任务就会被丢弃。

3、ThreadPoolExecutor.DiscardOdestPolicy

丢弃当前还未被执行的任务中的第一个任务,然后重新执行新加入的任务;如果线程池的调用线程被销毁了,那么新加入的任务就会被丢弃。

4、ThreadPoolExecutor.DiscardPolicy

直接丢弃新加入的任务。

相关文章:

  • 基于java程序设计课程辅助教学平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  • C#基础--集合
  • 【css】svg修改图标颜色
  • RHEL入门之系统角色
  • “50万以内最好SUV”G9上市2天即调价,何小鹏被用户拿捏了吗?
  • Matlab科研绘图颜色补充(特别篇7)—206种欧洲传统颜色
  • C# 异常捕获
  • 【Vue】列表动画
  • 实现一个简单的Database2(译文)
  • COMSOL中事件接口介绍
  • Python基础语法
  • 前端学习——Echarts5开发技术
  • 一个基于.Net Core+Vue+Element Ui开发的OA系统
  • Linux服务器性能监控,首选Zabbix6
  • SAP 系统银行账户管理
  • Android组件 - 收藏集 - 掘金
  • ES6 ...操作符
  • Go 语言编译器的 //go: 详解
  • HashMap剖析之内部结构
  • IP路由与转发
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • LeetCode算法系列_0891_子序列宽度之和
  • Python3爬取英雄联盟英雄皮肤大图
  • REST架构的思考
  • 测试如何在敏捷团队中工作?
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于List、List?、ListObject的区别
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 简单基于spring的redis配置(单机和集群模式)
  • 那些年我们用过的显示性能指标
  • 如何进阶一名有竞争力的程序员?
  • 微服务入门【系列视频课程】
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 运行时添加log4j2的appender
  • Nginx实现动静分离
  • ​批处理文件中的errorlevel用法
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十六)Flask之蓝图
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转) ns2/nam与nam实现相关的文件
  • **PHP分步表单提交思路(分页表单提交)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net下的富文本编辑器FCKeditor的配置方法
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Documented注解的作用
  • @staticmethod和@classmethod的作用与区别
  • @Transactional 详解