线程池参数及配置

article/2025/10/18 11:11:22

线程池-线程池参数及配置

在实际项目中线程的应用都会使用线程池来管理,线程池的常用参数及配置学习记录。


目录

线程池-线程池参数及配置

一、线程池

1、线程池的优势

二、线程池常用参数 ThreadPoolExecutor

1. corePoolSize:核心线程数

2. queueCapacity:任务队列容量(阻塞队列)

3. maxPoolSize:最大线程数

4. keepAliveTime:线程空闲保持时间

5. allowCoreThreadTimeout:允许核心线程超时

6.rejectedExecutionHandler:任务拒绝处理器

三、ThreadPoolExecutor执行过程

四、Java中4种线程池

4.1  newCachedThreadPool

4.2  newFixedThreadPool

4.3  newScheduledThreadPool

4.4  newSingleThreadExecutor

五、Java线程池参数配置

1、线程池的默认值

2、参数配置



一、线程池

        在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在 Java 中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。

       如果并发的线程数多,并且每个线程都是执行一个时间很短的任务就结束了,这样会造成频繁的创建和销毁线程从而导致降低系统的效率。

       线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。

       那么问题来了,有没有办法可用复用创建好的线程呢,也就是线程执行完一个任务后,不被销毁,继续执行其他的任务?

       用线程池来管理多个线程,复用空闲线程,减少线程的创建和销毁,提升系统性能。

1、线程池的优势

(1)降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;
(2)提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;
(3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。
(4)提供更强大的功能,延时定时线程池。


二、线程池常用参数 ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();this.acc = System.getSecurityManager() == null ?null :AccessController.getContext();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}

1. corePoolSize:核心线程数

1.1 核心线程会一直存活,即使没有任务需要执行。

1.2 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。

1.3 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。

1.4 可以通过 prestartCoreThread() 或 prestartAllCoreThreads() 方法来提前启动线程池中的基本线程。

2. queueCapacity:任务队列容量(阻塞队列)

2.1  当核心线程数达到最大时,新任务会放在队列中排队等待执行。

3. maxPoolSize:最大线程数

3.1  线程池所允许的最大线程个数

3.2  maxPoolSize>当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。

3.3  当线程数=maxPoolSize,且任务队列已满时,线程池会根据handle策略处理,默认是AbortPolicy 丢弃任务,抛运行时异常。

4. keepAliveTime:线程空闲保持时间

4.1 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize。

4.2 如果allowCoreThreadTimeout=true,则会直到线程数量=0。

5. allowCoreThreadTimeout:允许核心线程超时

6.rejectedExecutionHandler:任务拒绝处理器

6.1 两种情况会拒绝处理任务:

(1)当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务。

(2)当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务。线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常。

6.2 ThreadPoolExecutor类有几个内部实现类来处理这类情况-handle饱和策略:

(1)AbortPolicy 丢弃任务,抛运行时异常。

(2)CallerRunsPolicy 执行任务。

(3)DiscardPolicy 忽视,什么都不会发生。

(4)DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务。实现RejectedExecutionHandler接口,也可自定义处理器。

三、ThreadPoolExecutor执行过程

1.当线程数小于核心线程数时,创建线程。

2.当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。

3.当线程数大于等于核心线程数,且任务队列已满。

(1)若线程数小于最大线程数,创建线程。

(2)若线程数等于最大线程数,抛出异常,拒绝任务。

四、Java中4种线程池

Java通过Executors提供四种线程池,分别为:

4.1  newCachedThreadPool

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newCachedThreadPool:用来创建一个可以无限扩大的线程池,适用于负载较轻的场景,执行短期异步任务。(可以使得任务快速得到执行,因为任务时间执行短,可以很快结束,也不会造成cpu过度切换)

4.2  newFixedThreadPool

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newFixedThreadPool:创建一个固定大小的线程池,因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于负载较重的场景,对当前线程数量进行限制。(保证线程数可控,不会造成线程过多,导致系统负载更为严重)

4.3  newScheduledThreadPool

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newScheduledThreadPool:适用于执行延时或者周期性任务。

4.4  newSingleThreadExecutor

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

newSingleThreadExecutor:创建一个单线程的线程池,适用于需要保证顺序执行各个任务。

 

五、Java线程池参数配置

1、线程池的默认值

corePoolSize=1

queueCapacity=Integer.MAX_VALUE

maxPoolSize=Integer.MAX_VALUE

keepAliveTime=60s

allowCoreThreadTimeout=false

rejectedExcutionHandler=AbortPolicy()

2、参数配置

配置参数时需要考虑  CPU密集型任务 、 IO密集型任务 、内存使用率 、下游系统抗并发的能力 

配置参数:
CPU密集型 CPU的核数+1
IO密集型 一般配置 2*CPU的核数
参考公式(某大厂配置):
CPU核数/(1-阻塞系数) 阻塞系数在0.8~0.9之间
比如8核CPU 8/(1-0.9) = 80个线程数

 


参考

https://www.jianshu.com/p/7726c70cdc40

https://baijiahao.baidu.com/s?id=1637828094805085849

 


http://chatgpt.dhexx.cn/article/MU0BbX80.shtml

相关文章

线程池7个参数描述

所谓的线程池的 7 大参数是指&#xff0c;在使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数&#xff0c;如以下源码所示&#xff1a; public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable&…

Java线程池七个参数详解

java多线程开发时&#xff0c;常常用到线程池技术&#xff0c;这篇文章是对创建java线程池时的七个参数的详细解释。 从源码中可以看出&#xff0c;线程池的构造函数有7个参数&#xff0c;分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory…

【Android UI】贝塞尔曲线 ② ( 二阶贝塞尔曲线公式 | 三阶贝塞尔曲线及公式 | 高阶贝塞尔曲线 )

文章目录 一、二阶贝塞尔曲线公式二、三阶贝塞尔曲线三、高阶贝塞尔曲线 贝塞尔曲线参考 : https://github.com/venshine/BezierMaker 一、二阶贝塞尔曲线公式 二阶贝塞尔曲线公式如下 : B ( t ) ( 1 − t ) 2 P 0 2 t ( 1 − t ) P 1 t 2 P 2 , t ∈ [ 0 , 1 ] B(t) (1- t…

浅谈贝塞尔曲线

浅谈贝塞尔曲线 前段时间做了一个手写板功能的东西&#xff0c;其中手写部分用二次贝塞尔曲线完成&#xff0c;今天就来总结一下贝塞尔曲线在Android中的应用&#xff0c;先简单介绍各阶贝塞尔曲线的原理&#xff0c;然后实现通过贝塞尔曲线实现波浪线功能&#xff0c;感兴趣的…

View系列:贝塞尔曲线专栏:绘制二阶贝塞尔曲线(二)

1&#xff1a;Android贝塞尔曲线Api 作用相关Api备注移动起点moveTo移动下一次操作的起点位置连接直线lineTo添加上一个点到当前点的直线Path贝塞尔曲线qyadTo / cubicTo分别为绘制二次和三次贝塞尔曲线的方法闭合路径close从第一个点连接到最后一个点&#xff0c;形成一个闭合…

贝塞尔曲线原理

1 前言 贝塞尔曲线 (Bzier curve) 由法国数学家 Pierre Bzier 于 1962 年提出的一种矢量曲线&#xff0c;广泛应用于工程绘图、动画设计等领域。贝塞尔曲线是一种运动轨迹曲线&#xff0c;由 n 个点在 n 条线段上匀速运动&#xff08;不同线段上的速度可能不同&#xff09;&…

贝塞尔曲线简单介绍

什么是贝塞尔曲线&#xff1f; Bzier curve(贝塞尔曲线) 是应用于二维图形应用程序的数学曲线。 曲线定义&#xff1a;起始点、终止点&#xff08;也称锚点&#xff09;、控制点。通过调整控制点&#xff0c;贝塞尔曲线的形状会发生变化。 1962年&#xff0c;法国数学家Pierre…

贝塞尔曲线原理简述

1. 曲线算法简介&#xff1a; 贝塞尔曲线应用于二维图形应用程序的数学曲线&#xff0c;由一组控制点的向量来确定&#xff0c;给定的控制点按顺序连接构成控制多边形&#xff0c;贝塞尔曲线逼近这个多边形&#xff0c;进而通过调整控制点坐标改变曲线的形状。 2. 绘制曲线 …

贝塞尔曲线动画C++简单实践

目录 贝塞尔曲线简介一阶贝塞尔二阶贝塞尔三阶贝塞尔N阶贝塞尔曲线 贝塞尔曲线在动画中的应用实践求曲线散点坐标将曲线应用到动画动画框架cmd动画窗口动画 完整代码示例代码核心类代码BezierCurveAnimatorConsole 参考资料 贝塞尔曲线简介 由于用计算机画图大部分时间是操作鼠…

贝塞尔曲线及实践案例

文章目录 1. 前言2. 介绍2.1 一阶贝济埃曲线2.2 二阶贝塞尔曲线2.3 三阶贝塞尔曲线 3. 一、二、三阶贝塞尔曲线实现4. 案例5. 后记 1. 前言 贝塞尔曲线(Bzier curve)&#xff0c;又称贝兹曲线或贝济埃曲线&#xff0c;是应用于二维图形应用程序的数学曲线。一般的矢量图形软件…

贝塞尔曲线工具类

贝塞尔曲线工具类 先上一张效果图看效果 贝塞尔曲线 用于计算N阶贝塞尔曲线上的点&#xff0c;根据传入控制点的个数判定阶数N 贝塞尔曲线计算公式: 工具类源码 public class BezierUtils {/*** 获取二项式系数** param l 行(杨辉三角)* param c 列(杨辉三角)* return 系…

贝塞尔曲线打断生成两个贝塞尔曲线

问题&#xff1a;如何将一个三阶贝塞尔曲线打断生成两个三阶贝塞尔曲线&#xff0c;生成的两条贝塞尔曲线与原来的贝塞尔曲线重合&#xff1f; 输入&#xff1a;一条贝塞尔曲线的四个控制点P1,C1,C2,P2,和一个打断点E(E在曲线上) 输出&#xff1a;两条贝塞尔曲线: P1,F,I,E E,J…

html5贝塞尔曲线,Canvas学习:贝塞尔曲线

在绘制圆和圆弧一节中,了解到在Canvas中可以使用arc()和arcTo()绘制制圆或弧线,但很多时候,仅这两个方法还不能满足我们实际的需求,特别是绘制复杂的曲线。不过值得庆幸的是,在Canvas中还提供了其他的方法可以帮助我们绘制复杂的曲线。那就是我们今天要说的贝塞尔曲线,在…

贝塞尔曲线(Bezier Curve)

有兴趣的建议看这篇&#xff0c;比较新&#xff1a;https://zhuanlan.zhihu.com/p/366678047 曲线和曲面 在生活中存在着各种各样光滑的曲线或曲面&#xff0c;例如汽车的表面&#xff0c;钢珠球等。 在建模的时候&#xff0c;我们通常使用很多的小三角形来逼近这样的曲面&am…

java贝塞尔曲线_贝塞尔曲线学习

贝塞尔曲线学习 1.贝塞尔曲线 以下公式中: B(t)为t时间下 点的坐标; P0为起点,Pn为终点,Pi为控制点 一阶贝塞尔曲线(线段): 一阶贝塞尔曲线公式 一阶贝塞尔曲线演示 意义:由 P0 至 P1 的连续点, 描述的一条线段 二阶贝塞尔曲线(抛物线): 二阶贝塞尔曲线公式 二阶贝塞尔曲…

贝塞尔曲线

一&#xff1a;简介 1962年&#xff0c;法国工程师贝塞尔发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。 贝塞尔曲线是最基本的曲线&#xff0c;一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的…

【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现

RT&#xff0c;马三最近在参与一款足球游戏的开发&#xff0c;其中涉及到足球的各种运动轨迹和路径&#xff0c;比如射门的轨迹&#xff0c;高吊球&#xff0c;香蕉球的轨迹。最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动&#xff0c;后来的版本中使用了根据物…

Bezier Curve贝塞尔曲线概念

一、贝塞尔曲线的概念 对于两点之间的连线&#xff0c;我们可以用直线进行连接效果如下&#xff1a; 其中的每一个F点都在AB连接的线段上。 这就是一阶贝塞尔曲线。 如果我们加入一个控制点C&#xff0c;那么做图如下&#xff1a; 1、连接AC,BC&#xff1b; 2、在AC,B…

贝塞尔(贝兹尔)曲线介绍

2019独角兽企业重金招聘Python工程师标准>>> 贝塞尔(贝兹尔)曲线介绍 什么是贝塞尔曲线&#xff1f; “贝赛尔曲线”是由法国数学家Pierre Bzier所发明&#xff0c;由此为计算机矢量图形学奠定了基础。它的主要意义在于无论是直线或曲线都能在数学上予以描述。贝塞尔…

【ARM】-栈帧

ARM 栈帧 本系列均以 corter-A7(armv7-a) 为例 在 ARM 中&#xff0c;通常为满减栈&#xff08;Full Descending FD&#xff09;, 也就是说&#xff0c;堆栈指针指向堆栈内存中最后一个填充的位置&#xff0c;并且随着每个新数据项被压入堆栈而递减。 栈的本质 要理解栈的本…