java线程池的核心线程数与最大的线程数的区别,饱和策略

本文详细介绍了线程池的工作原理,包括任务分配流程、线程管理机制及饱和策略的选择。阐述了线程池如何根据核心线程数、最大线程数及任务队列的状态来决定任务的执行方式,并探讨了几种常见的饱和策略。


1、当提交一个新任务到线程池时首先线程池判断基本线程池(corePoolSize)是否已满?没满,创建一个工作线程来执行任务。满了,则进入下个流程;其次线程池判断工作队列(workQueue)是否已满?没满,则将新提交的任务存储在工作队列里。满了,则进入下个流程;最后线程池判断整个线程池(maximumPoolSize)是否已满?没满,则创建一个新的工作线程来执行任务,满了,则交给饱和策略来处理这个任务;如果线程池中的线程数量大于 corePoolSize 时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过 keepAliveTime,线程也会被终止。

2、饱和策略:

Abort策略:默认策略,新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获

CallerRuns策略:为调节机制,既不抛弃任务也不抛出异常,而是将某些任务回退到调用者。不会在线程池的线程中执行新的任务,而是在调用exector的线程中运行新的任务。

Discard策略:新提交的任务被抛弃。

Java自定义线程池中,核心参数包含核心线程数最大线程数、非核心线程的空闲时间、空闲时间的时间单位、等待队列、饱和策略用于创建新线程的工厂 [^3]。 - 核心线程数(corePoolSize):线程池中保持活跃的线程数量,即使线程空闲,核心线程也不会被回收 [^3]。 - 最大线程数(maximumPoolSize):线程池允许创建的最大线程数量,超过此数量的请求将被放入等待队列 [^3]。 当有任务进入线程池时,会先查看核心线程是否有空闲,若有则使用空闲线程执行任务;若核心线程都被占用,任务会被放入阻塞队列;若阻塞队列已满,则会使用最大线程数内的线程来执行任务 [^1]。 创建自定义线程池时,核心线程数量不能小于 0,最大线程数也不能小于 0,且最大数量要大于等于核心线程数量 [^4]。 示例代码如下: ```java import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; class MyRunnable implements Runnable { @Override public void run() { System.out.println("Task is running."); } } public class CustomThreadPoolExample { public static void main(String[] args) { ThreadPoolExecutor pool = new ThreadPoolExecutor( 3, // 核心线程数量,不能小于0 6, // 最大线程数,不能小于0,最大数量 >= 核心线程数量 60, // 空闲线程最大存活时间 TimeUnit.SECONDS, // 时间单位 new ArrayBlockingQueue<>(3), // 任务队列 Executors.defaultThreadFactory(), // 创建线程工厂 new ThreadPoolExecutor.AbortPolicy() // 任务的拒绝策略 ); pool.submit(new MyRunnable()); pool.shutdown(); } } ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值