线程池
2022-02-20 17:31:21 30 举报
AI智能生成
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果线程池中的线程数量大于处理命令的速度,那么空闲的线程就会被放入等待队列中。当请求命令时,就可以从等待队列中唤醒一个空闲的线程来执行命令。线程池不仅能够提高响应速度,还能降低资源消耗。
作者其他创作
大纲/内容
线程池是管理一堆就绪状态线程的池化技术
避免线程的重复创建和销毁带来的性能损耗,对线程统一管理
jdk提供的线程池
固定数量的线程池
核心线程数为参数传入,非核心线程数和核心线程数一样,
队列为无界队列,资源有限的时候容易引起OOM.
队列为无界队列,资源有限的时候容易引起OOM.
LinkedBlockingQueue无界队列
只有一个线程的线程池
保证任务的先后顺序和newFixedThreadPool(1)区别在于创建后不能重新配置线程
LinkedBlockingQueue无界队列
具备定时功能的线程池
可以定时的启动线程池的任务,核心线程数为 参数设定,非核心线程数为MAX_VALUE
DelayQueue延时队列到达指定时间才可以出列
动态创建可缓存线程的线程池
核心线程数为0,非核心线程数为MAX_VALUE,队列不存储值,
总认为队列是满的,所以每次执行任务时都会创建非核心线程,
非核心线程空闲了超过60秒(默认),就会自动回收。
总认为队列是满的,所以每次执行任务时都会创建非核心线程,
非核心线程空闲了超过60秒(默认),就会自动回收。
SynchronousQueue不存储任务的队列
jdk1.8新增可以把大任务拆分成小任务通过线程池的线程去分发执行任务
线程池的核心参数
核心线程数
理论上不能回收的线程数量
阻塞队列
任务量超过核心线程数,任务会依次进入队列
LinkedBlockingQueue链表默认为interager.max队列先进先出
链表无界阻塞队列,多了两个方法
链表双向无界阻塞队列,头部尾部都可以添加取出元素,降低锁竞争
DelayQueue延时队列到达指定时间才可以出列
SynchronousQueue不存储任务的队列
ArrayBlockingQueue数组类有界队列先进先出
PriorityBlockingQueue具有优先级排序的队列,实现Comparable指定元素排列方式
最大线程数
超过最大线程数时,会进入拒绝策略
线程工厂
创建线程,去执行提交的任务
拒绝策略
默认的是丢弃任务并抛错
丢弃任务不报错
自定义拒绝策略
由提交任务的主线程去执行
线程池的工作流程
1.向线程池提交任务,线程池判断提交的任务是否为空,为空抛异常
2.判断工作数是否小于核心线程数,小于的话,调用addworker(),
然后执行任务。大于的话判断线程池工作状态,向队列存放任务
然后执行任务。大于的话判断线程池工作状态,向队列存放任务
3.队列满了之后,仍然有新任务,就会创建小于最大线程数的线程去执行任务
4.最大线程数满足不了就进入自己选择的拒绝策略
线程池的工作状态
running可以接受任务,可以执行队列任务
shutdowm不可以接受新任务,可以执行队列任务
stop等其它三种状态不可以接收新任务,不可以执行队列任务
线程池的核心线程数怎么设置
分析下线程池处理的程序是CPU密集型,还是IO密集型
CPU密集型:核心线程数 = CPU核数 + 1
IO密集型:核心线程数 = CPU核数 * 2
CPU密集型:核心线程数 = CPU核数 + 1
IO密集型:核心线程数 = CPU核数 * 2
0 条评论
下一页