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

JUC入门(五)

11、线程池(重点)

线程池有三大方法、七大参数、4中拒绝策略

什么是池化技术

简单理解:预先创建,要用就拿

池化”(Pooling)是一种资源管理技术,用于优化资源的使用效率,减少资源创建和销毁的开销。池化技术的核心思想是预先创建并维护一组资源对象(如线程、数据库连接、对象实例等),当需要使用这些资源时,从池中获取一个可用的资源,使用完毕后将其归还到池中,而不是每次都重新创建和销毁资源。

这里讲述池化技术之一>线程池

线程池的好处:

  • 减少线程创建和销毁的开销:线程的创建和销毁是相对耗时的操作,线程池通过复用线程,避免了频繁的线程创建和销毁,从而提高了程序的性能。
  • 提高线程的可管理性:线程池可以对线程进行统一管理,例如限制线程的最大数量、设置线程的优先级等,避免线程过多导致的系统资源耗尽问题。
  • 提高响应速度:当有任务到来时,可以直接从线程池中获取线程执行,而不需要等待线程的创建,从而提高了系统的响应速度。

下面用自定义线程池的代码演示三大方法,七大参数、四大拒绝策略

package com.yw.Threadchi;import java.util.concurrent.*;public class Demo1 {public static void main(String[] args) {//三大线程池操作,不建议,可能会造成资源损耗
//        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();//单个线程
//        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池
//        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();//可伸缩的线程池,可根据情况调节自身大小ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,5,3,TimeUnit.SECONDS,new LinkedBlockingQueue<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());try {for (int i = 0;i < 9;i++) {threadPoolExecutor.execute(() -> {System.out.println(Thread.currentThread().getName() + "OK~");});}} catch (Exception e) {throw new RuntimeException(e);} finally {threadPoolExecutor.shutdown();}}}
corePoolSize

含义:核心线程数,即线程池中始终保持的线程数量。

作用

  • 当线程池中的线程数量小于 corePoolSize 时,即使有线程空闲,线程池也会优先创建新的线程来处理任务。
  • 这些核心线程默认会一直存活,即使它们处于空闲状态,也不会被销毁(除非设置了 allowCoreThreadTimeOuttrue)。
maximumPoolSize

含义:最大线程数,即线程池中允许的最大线程数量。

作用

  • 当线程池中的线程数量达到 corePoolSize 且任务队列已满时,线程池会尝试创建新的线程来处理任务,但线程数量不会超过 maximumPoolSize
  • 如果线程池中的线程数量已经达到 maximumPoolSize,且任务队列已满,此时再有新任务提交,线程池会拒绝执行任务,并抛出 RejectedExecutionException 异常(除非设置了拒绝策略)。
keepAliveTime

含义:非核心线程的空闲存活时间,即当线程池中的线程数量大于 corePoolSize 时,多余的线程在空闲状态下可以存活的最大时间。

作用

  • 如果一个线程在空闲状态下超过了 keepAliveTime,它会被销毁,从而减少线程池的资源占用。
  • 该参数仅对非核心线程有效,核心线程默认不会被销毁(除非设置了 allowCoreThreadTimeOuttrue)。
unit

含义keepAliveTime 参数的时间单位,用于指定 keepAliveTime 的时间单位。

常见的时间单位有 TimeUnit.SECONDS(秒)、TimeUnit.MILLISECONDS(毫秒)、TimeUnit.MINUTES(分钟)等。

workQueue

含义:任务队列,用于存储等待执行的任务。

作用

  • 当线程池中的线程数量达到 corePoolSize 时,新提交的任务会被放入任务队列中等待执行。
  • 如果任务队列已满且线程池中的线程数量小于 maximumPoolSize,线程池会创建新的线程来处理任务。
  • 如果大于了maximumPoolSize,会根据对应的拒绝策略拒绝线程

常见任务队列类型

  • ArrayBlockingQueue:基于数组的有界阻塞队列,需要指定队列容量。
  • LinkedBlockingQueue:基于链表的无界阻塞队列(实际上有最大容量限制,但通常很大)。
  • SynchronousQueue:不存储任务的阻塞队列,每个插入操作必须等待一个移除操作,反之亦然。
  • PriorityBlockingQueue:支持优先级排序的无界阻塞队列。
threadFactory

含义:线程工厂,用于创建新线程。

作用

  • 默认情况下,线程池会使用 Executors.defaultThreadFactory() 创建线程,但可以通过自定义 ThreadFactory 来设置线程的名称、优先级等属性。

  • 一般不会改变,直接用Executors.defaultThreadFactory();

handler

含义:拒绝策略,用于处理线程池拒绝任务的情况。

作用

  • 当线程池中的线程数量达到 maximumPoolSize 且任务队列已满时,再有新任务提交,线程池会调用拒绝策略来处理这些任务。

四大拒绝策略
  • AbortPolicy:默认拒绝策略,抛出 RejectedExecutionException 异常。

  • CallerRunsPolicy:由提交任务的线程(调用者线程)来执行任务。

  • DiscardPolicy:直接丢弃任务,不抛出异常。

  • DiscardOldestPolicy:丢弃队列中最老的任务(即队列头部的任务),然后尝试将新任务加入队列。

扩展:最大线程该如何定义?

根据具体任务类型cpu密集型和io密集型来确定最大线程,是优化线程池性能的关键步骤

CPU密集型任务

对于CPU密集型任务,线程池中的线程主要在执行计算操作,CPU利用率较高。因此,线程数量应与CPU核心数相匹配,以避免过多的上下文切换和资源竞争。

建议的最大线程数

  • 核心线程数(corePoolSize:设置为CPU核心数。

  • 最大线程数(maximumPoolSize:设置为CPU核心数的1.5到2倍。

I/O密集型任务

对于I/O密集型任务,线程大部分时间都在等待I/O操作完成,CPU利用率较低。因此,可以设置更多的线程来提高系统的并发性能。

建议的最大线程数

  • 核心线程数(corePoolSize:设置为CPU核心数的2到4倍。

  • 最大线程数(maximumPoolSize:设置为CPU核心数的数倍,甚至更高(如10倍)。

http://www.xdnf.cn/news/8256.html

相关文章:

  • 进程、线程和协程切换的比喻
  • 【分治】归并排序:递归版 非递归版
  • IDC机房交换机紧急更换的流程和注意事项
  • torch.gather()和torch.sort
  • 火语言UI组件--控件函数调用
  • 免费开源的图片分割小工具
  • RT-Thread源码阅读(1)——基本框架
  • 通过云服务器实现异地组网 部署WireGuard
  • 【机器学习】 关于外插修正随机梯度方法的数值实验
  • 听脑AI:革新沟通方式,开启高效信息时代
  • 核实发票的真实性与合法性-发票查验接口-虚假发票防范
  • 关于Newtonsoft版本不兼容问题处理
  • sentinel滑动时间窗口算法详解
  • 系统性能分析基本概念(3) : Tuning Efforts
  • imuerrset
  • PT8P2104触控型8Bit MCU
  • 【Django Serializer】一篇文章详解 Django 序列化器
  • deep-rtsp 摄像头rtsp配置工具
  • 高频与超高频RFID读写器技术应用差异解析
  • 论文解读: 2018-Detection of spam reviews: a sentiment analysis approach
  • 宝尊电商一季度净收入21亿元 品牌管理收入同比大增
  • 冲刺卷软考总结-案例分析
  • 地信GIS专业关于学习、考研、就业方面的一些问题答疑
  • Windows系统下Docker安装青龙面板
  • 常见高危端口解析:网络安全中的“危险入口”
  • 101个α因子#15
  • CentOS7安装 PHP-FPM 7.4
  • 2025海外短剧CPS系统开发指南:高付费市场解析与增速全景图
  • 【CSS】九宫格布局
  • openEuler 22.03 LTS-SP3 系统安装 docker 26.1.3、docker-compose