public static void main(String[] args) { // 创建线程池 , 参数含义 :(核心线程数,最大线程数,加开线程的存活时间,时间单位,任务队列长度) ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 8, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(2)); //设置:任务数 = 3 ~ 11 ,分析:任务数 与 活跃线程数,核心线程数,队列长度,最大线程数的关系。 int a = 3; for (int i = 1; i <= a; i++) { int j = i; pool.submit(new Runnable() { @Override public void run() { //获取线程名称 Thread thread = Thread.currentThread(); String name = thread.getName(); int activeCount = pool.getActiveCount(); System.out.println("任务:"+j+"-----,线程名称:"+name+"-----活跃线程数:"+activeCount); //关闭线程池 pool.shutdown();

输出结果,观察关系:

//任务数 a = 3 , 活跃线程数3 , 任务数 < 核心线程数。
//任务数 a = 4 , 活跃线程数4 , 任务数 < 核心线程数。
//任务数 a = 5 , 活跃线程数5 , 任务数 = 核心线程数。
//任务数 a = 6 , 活跃线程数5 , 任务数 < 核心线程数5 + 队列长度2 。
//任务数 a = 7 , 活跃线程数5 , 任务数 = 核心线程数5 + 队列长度2 。
//任务数 a = 8 , 活跃线程数6 , 任务数 < 最大线程数8 + 队列长度2 。活跃线程数是在核心线程数5的基础上,加1个活跃线程。
//任务数 a = 9 , 活跃线程数7 , 任务数 < 最大线程数8 + 队列长度2 。活跃线程数是在核心线程数5的基础上,加2个活跃线程。
//任务数 a = 10 , 活跃线程数8 , 任务数 = 最大线程数8 + 队列长度2 。活跃线程数是在核心线程数5的基础上,加3个活跃线程。
//任务数 a = 11 , 活跃线程数8 , 任务数 > 最大线程数8 + 队列长度2 。抛出异常RejectedExecutionException

随着任务数量的增加,会增加活跃的线程数。
当活跃的线程数 =   核心线程数,此时不再增加活跃线程数,而是往任务队列里堆积。
当任务队列堆满了,随着任务数量的增加,会在核心线程数的基础上加开线程。
直到活跃线程数 = 最大线程数,就不能增加线程了。
如果此时任务还在增加,则: 任务数11 > 最大线程数8 + 队列长度2 ,抛出异常RejectedExecutionException,拒绝任务。

关于线程池的几个参数,很多人不是很清楚如何配置,他们之间是什么关系,我用代码来证明一下。package www.itbac.com;import java.util.concurrent.*;public class ExecutorTest { public static void main(String[] args) { // 创建线程池 , 参数含义 :(核心线程数,最大线程数,加开线程的存活时间,时间单位,任务队列长度) Thre
文章目录 线程池 内部运行过程验证思路确保先提交的 任务 优先被 线程池 处理确保执行的 任务 占有足够久的 线程池 资源可观测的阻塞 队列 大小充分的信息代码自定义 线程池 结果结论基本几结论新 任务 提交在 线程池 内部处理的优先级 线程池 内部运行过程 线程池 的初始参 中包含 核心 线程 最大 线程 线程池 线程 空闲回收时间、阻塞 队列 线程 工厂、拒绝策略。 那么 线程池 是如何管理 线程 和阻塞 队列 关系 呢? 确保先提交的 任务 优先被 线程池 处理 多 线程 执行本身是无序的,原因在于并发操作下,后面提交的 任务 也可能被先运行,因此,为了确保先提交的
java 线程池 使用–配置 核心 线程 参考 1.先看下机器的CPU核 ,然后在设定具体参 : CPU核 = Runtime.getRuntime().availableProcessors() 2.分析 任务 是io密集还是cpu密集: CPU密集型:特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等, 随着 任务 的增多, 任务 切换的时间就越多,cpu执行效率就越低。所以,要最高效地利用CPU,计算密集型 任务 同时进行的 量应当等于CPU的 核心 。 IO密集型:涉及到网络、磁盘IO的 任务 都是I
通过 线程池 主要是创建以下4种类型的 线程池 。 工具类 : Executors ExecutorService newFixedThreadPool() : 创建固定大小的 线程池 ExecutorService newCachedThreadPool() : 缓存线...
原文地址:http://www.eussi.top/view/18 生产上遇到后端系统 任务 线程池 中累积了几个小时的情况,主要是 线程池 统一配置,没有根据具体交易的情况进行具体设置造成的,经过查阅网上相关资料,总结一下如何对 线程池 的几个参 进行设置: 1-首先预估系统负载,需要以下几个值: tasks :每秒的 任务 ,假设为50~100 taskTime:每个 任务 花费时间,假设为0.1s resp...
一个demo让你彻底理解 线程池 工作流程 其实jva好多的实现都是可以在现实生活中找到对应的场景的, 线程池 可以比做现实中的银行营业厅。 要搞清楚上面这篇文档,就要抓住一个点:当前 线程池 的工作 线程 量是多少?如下: ● 任务 <= 核心 线程 时, 线程池 中工作 线程 = 任务 核心 线程 + 队列 容量 < 任务 <= 最大 线程 + 队列 容量 时,工作 线程 = 任务 核心 线程 会一直存活,及时没有 任务 需要执行 当 线程 小于 核心 线程 时,即使有 线程 空闲, 线程池 也会优先创建新 线程 处理 设置allowCoreThreadTimeout=true(默认false)时, 核心 线程 会超时关闭 queueCapacity: 任务 队列 容量 (阻塞 队列
1.资源简介:PyQt5中使用多 线程 模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用 线程池 ThreadPoolExecutor 解决了ping多个IP多 任务 耗时问题。 2.适用人群:想学习PyQt5中多 线程 模块QThread和 线程池 ThreadPoolExecutor 知识的人。
1**.在 java 中 wait 和 sleep 方法的不同?** 最大 的不同是在等待时 wait 会释放锁,而 sleep 一直保持有锁。wait通常被用于 线程 间交互,sleep 通常被用于暂停执行。 2.同步锁与死锁 同步锁是当多个 线程 在同一时间内只允许一个 线程 来操作 据,可以用用 synchronized 关键字来实现 死锁是指多个 线程 同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。 为什么要用锁当多个 线程 同时访问同一个 据时,很容易出现问题。为了避免这种情况出现,我们要保证 线程 同步
1.继承Thread类创建多 线程 :定义一个类继承Thread类,重写run方法,创建该类的实例对象,调用start方法启动 线程 。 2.实现Runnable接口创建多 线程 :定义一个类实现runnable接口,创建该类的实例对象o,将o作为构造器参 传入Thread类实例对象,调用start方法启动 线程 。 3.通过Callable和Future接口创建多 线程 :创建callable的实... 允许的请求 队列 长度 为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。 CachedThreadPool 和 ScheduledThreadPool: 允许的创建 线程 量为 Integer.MAX_VALUE,可能会创建大量的 线程 ,从而导致 OOM。 所以建议用 ThreadPoolExecutor 创建 线程池 ,用.
ThreadPoolExecutor 线程池 最大 线程 取决于以下几个因素: 1. 构造函 ThreadPoolExecutor 的构造函 可以指定 核心 线程 最大 线程 和等待 队列 容量 。其中, 最大 线程 就是通过参 传入的。 2. 默认值:如果构造函 没有指定 最大 线程 ,则会使用 ThreadPoolExecutor 类的默认值。在 Java 8 中,默认的 最大 线程 为 Integer.MAX_VALUE。 3. 任务 队列 :当 线程池 中的 线程 达到 核心 线程 时,新的 任务 会被放入等待 队列 中。当等待 队列 已满时,才会创建新的 线程 执行 任务 。因此, 最大 线程 也受等待 队列 容量 限制。 综上所述, ThreadPoolExecutor 线程池 最大 线程 可以通过构造函 或默认值设置,并且受等待 队列 容量 的影响。