线程池构造方法的认识

news2025/4/16 20:20:26

线程池中构造方法的认识

文章目录

  • 线程池中构造方法的认识
    • 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()  // 自定义拒绝策略
);

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库编程大赛:一条SQL计算扑克牌24点

你是否在寻找一个平台,能让你展示你的SQL技能,与同行们一较高下?你是否渴望在实战中提升你的SQL水平,开阔你的技术视野?如果你对这些都感兴趣,那么本次由NineData主办的《数据库编程大赛》,将是…

【Oracle】修改表结构

目录 创建示例1:添加一个或多个列 创建示例2:修改列定义 创建示例3: 删除一列或多列 创建示例4:重命名列 创建示例5:重命名表 创建示例1:添加一个或多个列 -----语法:将新列添加到表中 ALTER TABLE table_name A…

数据权限篇

文章目录 1. 如何实现数据权限(内核)1.1 原理1.2 源码实现,mybatis如何重写sql1.2.1 重写sql1.2.2 解析sql1.2.3 DataPermissionDatabaseInterceptor 1. 如何实现数据权限(内核) 1.1 原理 面对复杂多变的需求&#xf…

关于JVM的垃圾回收GC的一些记录

目录 一、JVM内存区域划分 二、从一个基本问题开始引入垃圾回收 三、GC作用的区域 三、如何确定一个对象是否可以被当成垃圾进行回收 (1)引用计数法 (2)可达性分析算法 (3)引用的类型 (3…

Java经典面试题——手写快速排序和归并排序

题目链接:https://www.luogu.com.cn/problem/P1177 输入模板: 5 4 2 4 5 1快速排序 技巧:交换数组中的两个位置 a[l] a[l] a[r] - (a[r] a[l]); 稳定不稳定?:不稳定 注意找哨兵那里内循环的等于号不能漏,不然…

202355读书笔记|微读699元的书读后感——《走进美加风光摄影集》

202355读书笔记|微读699元的书读后感——《走进美加风光摄影集》 旧文新发,有一天跟同事聊起,我在某个平台写了30万字,ta很惊讶,其实还有很多私密的,公开的话更多,这或许是北飘留给我的礼物吧,在…

MFC窗体背景颜色的设置、控件白色背景问题、控件文本显示重叠问题、被父窗体背景覆盖的问题

文章目录 设置mfc窗体背景颜色窗体设置背景颜色后解决控件白色背景解决重复修改控件文本后重叠的问题自绘控件被父窗体背景覆盖的问题 设置mfc窗体背景颜色 设置窗体的背景颜色非常简单,只需要在窗体的OnEraseBkgnd里面填充窗体背景就可以了,甚至直接画…

在 linux 服务器上安装Redis数据库

先打开我们的Linux服务器 终端执行 安装redis sudo yum install redis然后 他会提示你要占多少磁盘空间 例如 我这里是 1.7 M 没问题就 y 然后回车就可以了 然后 我们这里执行 redis-cli --version这样 就能看到版本了 然后 我们可以根据版本选择启动命令 使用systemctl命…

【数据结构】最短路径算法实现(Dijkstra(迪克斯特拉),FloydWarshall(弗洛伊德) )

文章目录 前言一、Dijkstra(迪克斯特拉)1.方法:2.代码实现 二、FloydWarshall(弗洛伊德)1.方法2.代码实现 完整源码 前言 最短路径问题:从在带权有向图G中的某一顶点出发,找出一条通往另一顶点…

Ubuntu 常用命令之 gunzip 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 gunzip是一个在Ubuntu系统下用于解压缩文件的命令。它主要用于解压.gz格式的文件。这个命令是gzip命令的反向操作,gzip用于压缩文件,而gunzip则用于解压缩文件。 gunzip命令的参数有 -c 或 --stdout 或 -…

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定…

Java语法---使用sort进行排序

目录 一、升序 二、降序 (1)类实现接口 (2)匿名内部类 三、自定义排序规则 四、集合中的sort排序 (1)升序 (2)降序 (3)自定义排序 一、升序 升序排…

IDEA——IDEA中文件内容对比功能的使用,如何快速定位看文件内容是否产生变化!!!

文件内容对比 一、对比磁盘中的某一文件二、直接对比两个文件 总结 本篇文章介绍一下如何在IDEA中对比两个文件的内容是否相同。 一、对比磁盘中的某一文件 选中一个文件,右键->点击Compare With 选择要对比的文件即可 二、直接对比两个文件 同时选中两个文…

基于协同过滤的电影评论数据分析与推荐系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目介绍 随着社会的发展,人们生活水平的提高,欣赏电影逐渐成为人们闲暇时的主要娱乐方式之一。本文电影推荐系统是为了给顾客提供方便快捷的热门电影推荐以及查询电影资讯而建立的&…

C# 跨越配置

跨越配置1 项目框架 .NET Framework 1.web.config配置 在system.webServer节点中添httpProtocol子节点 Access-Control-Allow-Origin值为“*”” <httpProtocol><customHeaders><add name"Access-Control-Allow-Origin" value"*" /><…

redis 从0到1完整学习 (六):Hash 表数据结构

文章目录 1. 引言2. redis 源码下载3. dict 数据结构4. 哈希表扩容与 rehash5. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;red…

MATLAB - 估计滤波器(Estimation Filters)

系列文章目录 前言 本篇文章翻译自官网&#xff0c;部分下标有问题&#xff0c;请自行分辨。 一、背景介绍 1.1 估算系统 对于许多自主系统&#xff08;autonomous systems&#xff09;来说&#xff0c;了解系统状态&#xff08;system state&#xff09;是设计任何应用的先决…

Linux命令-查看内存、GC情况及jmap 用法

查看进程占用内存、CPU使用情况 1、查看进程 #jps 查看所有java进程 #top 查看cpu占用高进程 输入m &#xff1a;根据内存排序 topMem: 16333644k total, 9472968k used, 6860676k free, 165616k buffers Swap: 0k total, 0k used, 0k free, 6…

【网络编程】网络通信基础——简述TCP/IP协议

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、ip地…