线程池构造方法的认识

线程池中构造方法的认识

文章目录

  • 线程池中构造方法的认识
    • corePoolSize (核心线程数)
    • maximumPoolSize(最大线程数)
    • keepAliveTime(非核心线程的空闲超时时间)
    • TimeUnit
    • workQueue
    • threadFactory
    • RejectedExecutionHandler拒绝策略

标准库中提供了一个ThreadPoolExecutor类,这个类中最复杂的就是构造方法,而且这个类中由于构造方法过于复杂
而且有缺陷,所以就对外提供了创建实例的 “工厂方法” ,这样的方法其实就是普通的静态方法.

工厂方法的内部有给我们提供构造想要的实例的代码实现,所以我们只需要通过工厂方法的方法名来获取我们想要的实例即可.

线程池是Java标准库中的Java.util.concurrent.ThreadPoolExecutor类中.

标准库中提供了一个 Java.util.concurrent.ThreadPoolExecutor类

这个类中的构造方法比较多,我们主要了解参数最多最复杂的那个构造方法

image-20231223223758263

我们来一个一个的解释:

corePoolSize 核心线程数和maxmumPoolSize最大线程数分别都是什么?都有什么区别?

corePoolSize (核心线程数)

corePoolSize 是线程池的基本大小,表示在没有任务执行时,线程池维护的线程数。即使这些线程当前处于空闲状态,它们也会被保留在池中。
当有新任务提交到线程池时,如果当前池中的线程数小于 corePoolSize,则会创建一个新线程来执行任务,即使其他线程处于空闲状态。
如果任务数超过 corePoolSize,而任务队列未满,新任务将被放入任务队列而不是新建线程(除非线程池已满)。

maximumPoolSize(最大线程数)

maximumPoolSize 表示线程池的最大大小,即线程池中允许的最大线程数。
当任务队列已满且池中线程数小于 maximumPoolSize 时,线程池会创建新的线程来执行任务,直到达到最大线程数。
超过最大线程数的任务将被拒绝(默认是抛出 RejectedExecutionException 异常,但可以通过设置拒绝策略来进行不同的处理)。

  • 区别:

在池中运行的线程数将在 corePoolSize 和 maximumPoolSize 之间进行动态调整。
当任务数增加时,线程池会尽可能地扩展到 maximumPoolSize;当任务数减少时,线程池会逐渐收缩到 corePoolSize。
corePoolSize 提供了一种在任务轻量时保持一定线程数的机制,以提高任务的响应速度。
而 maximumPoolSize 提供了在负载较大时临时增加线程数以处理额外任务的机制。
在构建 ThreadPoolExecutor 时,合理设置 corePoolSize 和 maximumPoolSize 是关键,以确保线程池能够在不同负载下表现出理想的性能。

keepAliveTime(非核心线程的空闲超时时间)

  • keepAliveTime 表示非核心线程的空闲超时时间,即当线程池中的线程数大于核心线程数时,
    空闲的非核心线程在经过一定时间后会被终止并从线程池中移除。
  • 如果线程池的线程数超过核心线程数,但有一些线程在一段时间内没有执行任务,
    这些线程就被认为是空闲的。keepAliveTime 就是指定这些空闲线程的最大存活时间。

TimeUnit

  • TimeUnit 是一个枚举类型,用于表示时间单位。它规定了 keepAliveTime的时间单位,
    包括 NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS、MINUTES、HOURS 和 DAYS。
  • 当设置 keepAliveTime 时,需要同时指定时间单位,以便正确地解释超时时间。
    例如,通过设置 TimeUnit.SECONDS可以将超时时间单位设置为秒。

workQueue

workQueue 是 ThreadPoolExecutor 中的一个参数,用于指定任务队列。
线程池的任务队列主要用于存储提交但尚未被执行的任务。用户可以手动传入一个任务队列,
这样可以根据实际需求选择不同的队列实现,以满足特定的场景和性能要求。例如,在某些场景下,对响应时间要求较高,可以选择同步队列;而在某些场景下,
对系统资源的使用有更高的要求,可以选择有界队列或无界队列。手动传入任务队列是为了提供更大的灵活性和定制性。

这个参数允许用户自定义创建新线程的方式,从而可以控制线程的创建过程,包括线程的名字、优先级、守护状态等。

threadFactory

threadFactory 参数是一个实现了 ThreadFactory 接口的对象。ThreadFactory 是一个简单的接口,它只有一个方法:Thread newThread(Runnable r)。当线程池需要创建一个新线程时,会调用这个方法。

RejectedExecutionHandler拒绝策略

线程池的拒绝策略

线程池的任务队列已经满了(工作线程已经忙不过来了)如果又有别人
往里面添加新的任务,怎么办?

  • 这个策略对于我们实现高并发服务器,是十分有意义的

image-20231223225746300

Java中的线程池在面临无法接受新任务的情况时,会执行拒绝策略。
拒绝策略定义了在线程池饱和时如何处理新任务的策略。
ThreadPoolExecutor 提供了几种内置的拒绝策略,同时也允许用户自定义拒绝策略。

以下是Java中常见的拒绝策略:

  1. AbortPolicy(默认策略):

    • AbortPolicy是 ThreadPoolExecutor的默认拒绝策略。
      当任务无法被提交时,会抛出 RejectedExecutionException 异常。
  2. CallerRunsPolicy:

    • CallerRunsPolicy拒绝策略将会把任务返回给提交任务的线程执行。这种方式,
      虽然可能导致调用线程变慢,但是不会抛出异常。
  3. DiscardPolicy:

    • DiscardPolicy拒绝策略会默默地丢弃无法处理的任务,不会抛出异常。
  4. DiscardOldestPolicy:

    • DiscardOldestPolicy拒绝策略会丢弃队列中等待时间最久的任务,然后将新任务加入队列。同样,不会抛出异常。

用户还可以通过实现 RejectedExecutionHandler 接口来定义自己的拒绝策略。
自定义拒绝策略需要实现 RejectedExecutionHandler接口的 rejectedExecution方法,
该方法定义了任务被拒绝时的处理逻辑。

示例代码:

public class CustomRejectedHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 自定义处理逻辑,例如记录日志、通知等
        System.err.println("Task rejected: " + r.toString());
    }
}

// 使用自定义拒绝策略
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize,       // 核心线程数
    maximumPoolSize,    // 最大线程数
    keepAliveTime,      // 非核心线程的空闲超时时间
    TimeUnit.SECONDS,   // 时间单位
    workQueue,          // 任务队列
    new CustomRejectedHandler()  // 自定义拒绝策略
);

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 enum类型

enum,枚举,是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。 语法&#xff1a; enum 枚举名 {枚举元素1,枚举元素2,……}; 直接上例子 #include<stdio.h> enum DAY { MON1, TUE, WED, TH…

华为鸿蒙应用--封装数据持久化工具:首选项Preferences(鸿蒙工具)-ArkTs

一、使用方法&#xff1a; 0、初始化实例&#xff1a;一般在EntryAbility.ts的onWindowStageCreate中初始化&#xff1b;&#xff08;可忽略&#xff09; 1、将数据写入Preferences实例 function() {let arrayNum: number[] [1, 2, 3];let arrayStr: string[] ["5&quo…

2023美团机器人研究院学术年会成功举办

2023年12月19日&#xff0c;深圳市美团机器人研究院学术年会在清华大学深圳国际研究生院成功落下帷幕。会议回顾了研究院成立一年来的进展和成果&#xff0c;并邀请了各界专家共同讨论机器人技术的未来发展趋势。此外&#xff0c;年会期间还举办了首届低空经济智能飞行管理挑战…

Web前端复习

一、随堂练习 1.小题 margin vanish&#xff1a;border和inline-block都可以形成bfc二维数组转置&#xff1a;res[i] [];函数的不同声明定义&#xff1a; 有变量名字的函数&#xff0c;即便后面声明了同样的&#xff0c;以函数表达式为主&#xff1b;定义&#xff0c;运行。再…

VS Code实现“Ctr+save”保存代码自动格式化

一、下载Prettier - Code formatter插件 点击安装即可 二、配置 【1】打开文件——首选项——设置 或者左下角齿轮打开设置 【2】搜索设置框输入editor default formatter&#xff08;意思是默认格式化设置&#xff09;&#xff0c;接着下拉选中刚下好的插件名称Prettier - C…

网络爬虫之多任务数据采集(多线程、多进程、协程)

进程&#xff1a;是操作系统中资源分配的基本单位 线程&#xff1a;使用进程分配的资源处理具体任务 一个进程中可以有多个线程&#xff1a;进程相当于一个公司&#xff0c;线程就是公司里面的员工。 一 多线程 多线程都是关于功能的并发执行。而异步编程是关于函数之间的非…

N-136基于springboot,vue在线聊天系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;TypeScriptVue3.0ElementUI-Plus 服务端技术&#xff1a;springboo…

【常见的语法糖(详解)】

&#x1f7e9; 说几个常见的语法糖 &#x1f7e2;关于语法糖的典型解析&#x1f7e2;如何解语法糖&#xff1f;&#x1f7e2;糖块一、switch 支持 String 与枚举&#x1f4d9;糖块二、泛型&#x1f4dd;糖块三、自动装箱与拆箱&#x1f341;糖块四、方法变长参数&#x1f5a5;️…

十.MySQL数据类型精讲(一)

MySQL数据类型精讲 1.MySQL中的数据类型2.整数类型2.1类型介绍2.2可选属性2.2.1 M 2.2UNSIGNED2.3ZEROFILL2.3使用场景2.4如何选择 3.浮点类型3.1类型介绍3.2数据精度说明3.3精度误差说明 4.定点数类型4.2开发中经验 5.位类型&#xff1a;BIT 1.MySQL中的数据类型 类型类型举例…

小白入门之安装MAVEN

重生之我在大四学JAVA 第六章 安装MAVEN 打开IDEA&#xff0c;配置MAVEN 打开Setting 找到上面设置的settings.xml文件地址 至此MAVEN也就安装成功了 附赠一个maven清理脚本&#xff0c;如果发现你的电脑maven下载不了jar&#xff0c;依赖爆红&#xff0c;可以试下下面bat脚…

limma:单通道数据和RNA-seq数据差异性分析标准方法

前言 单通道数据极为流行&#xff0c;三大公司&#xff1a;Affymetrix、Illumina和Agilent的微阵列&#xff08;microarray&#xff09;技术产生的很多都是单通道数据。现在的主力的高通量测序机所产生的也是单通道数据&#xff0c;所以只要是被voom标准化&#xff08;包括了l…

【操作系统】学习操作系统知识

文章目录 前言测量系统调用和上下文切换的成本purify 和 valgrindxx3 的执行过程 前言 ref&#xff1a;http://ges.cs.wisc.edu/~remzi/OSTEP/Chinese 零散的记录知识&#xff0c;看《操作系统引论》 测量系统调用和上下文切换的成本 上下文切换需要多长时间&#xff1f;甚…

SpringBoot+SSM项目实战 苍穹外卖(7)(Spring Cache)

继续上一节的内容&#xff0c;本节实现缓存菜品、缓存套餐、添加购物车、查看购物车和清空购物车功能。 目录 缓存菜品缓存套餐(基于Spring Cache)EnableCaching、Cacheable、CachePut和CacheEvictSpring Cache实现缓存套餐 添加购物车查看购物车清空购物车 缓存菜品 用户端小…

STANFORD斯坦福FS725铷钟

FS725在一个紧凑的半宽2U机箱中集成了一个铷原子振荡器&#xff08;SRS型号PRS10&#xff09;、一个低噪声通用交流电源和分配放大器。它提供稳定和可靠的性能&#xff0c;估计20年的老化率低于510-9&#xff0c;并证明铷原子振荡器的MTBF超过20万小时。FS725是校准和研发实验室…

@z-utils组 重构和自动化实现

highlight: monokai theme: github 包简介 z-utils组 是一个可以在vue/react/pure js 中使用的工具包&#xff0c;它包含三个子类&#xff0c;分别为 z-utils/base, z-utils/react, z-utils/vue 三个分别在不同区域使用。 他是原 zzy-javascript-devtools 的重构版本&#xf…

Java多线程技术四——定时器

1 定时器的使用 在JDK库中Timer类主要负责计划任务的功能&#xff0c;也就是在指定的时间开始执行某一个任务&#xff0c;Timer类的方法列表如下&#xff1a; Timer类的主要作用就是设置计划任务&#xff0c;封装任务的类却是TimerTask&#xff0c;该类的结构如下图 因为TimerT…

计算机网络复习-OSI TCP/IP 物理层

我膨胀了&#xff0c;挂我啊~ 作者简介&#xff1a; 每年都吐槽吉师网安奇怪的课程安排、全校正经学网络安全不超20人情景以及割韭菜企业合作的FW&#xff0c;今年是第一年。。 TCP/IP模型 先做两道题&#xff1a; TCP/IP协议模型由高层到低层分为哪几层&#xff1a; 这题…

Angular 11到升级到 Angular 16

日新月异&#xff0c;与时俱进… 随着Angular版本不断更新&#xff0c;再看所开发的项目版本仍然是Angular 11&#xff0c;于是准备升级 截止发博日最版本是 v17.1.0&#xff0c;考虑到稳定性因素决定升级到v16版本 一&#xff1a;查看 升级指南 二&#xff1a;按照指南&…

【ArduinoOTA无线(OTA)更新的EASY指南】

【ArduinoOTA无线&#xff08;OTA&#xff09;更新的EASY指南】 1. 前言2. 了解 ESP32 的 ArduinoOTA3. 无线更新案例4. ArduinoOTA入门5. 安装必备组件6. 设置硬件7. ESP32 OTA 的最低代码8. 按照我们的流程学习Arduino编程➜9. 这对OTA来说非常重要10. 通过无线方式将草图上传…

IIS服务器的配置与管理

1) 安装IIS服务器&#xff0c;并添加站点&#xff0c;该服务器的IP地址为192.168.1.xx 。 2) 配置网站&#xff0c;并设置该站点不允许匿名访问&#xff0c;仅允许使用自己的本地用户登录连接。 3) 配置网站&#xff0c;限制拒绝192.168.1.100IP地址访问 。 4) 客户端使用19…