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
线程池
的
最大
线程
数
可以通过构造函
数
参
数
或默认值设置,并且受等待
队列
容量
的影响。