线程池的类型有哪些?适用场景?第二篇

简介: 线程池的类型有哪些?适用场景?第二篇

CachedThreadPool

根据需要创建新线程的线程池。

publicstaticExecutorServicenewCachedThreadPool() {
returnnewThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
newSynchronousQueue<Runnable>());
}

如果主线程提交任务的速度高于线程处理任务的速度时, CachedThreadPool 会不断创建新的线程。极 端情况下,这样会导致耗尽 cpu 和内存资源。

使用没有容量的SynchronousQueue作为线程池工作队列,当线程池有空闲线程时, SynchronousQueue.offer(Runnable task) 提交的任务会被空闲线程处理,否则会创建新的线程处理任务。

适用场景:用于并发执行大量短期的小任务。

CachedThreadPool 允许创建的线程数量Integer.MAX_VALUE ,可能会创建大量线程,从而导致 OOM。

ScheduledThreadPoolExecutor

在给定的延迟后运行任务,或者定期执行任务。在实际项目中基本不会被用到,因为有其他方案选择比如 quartz 。

使用的任务队列 DelayQueue 封装了一个 PriorityQueue , PriorityQueue 会对队列中的任务进行 排序,时间早的任务先被执行(即 ScheduledFutureTask 的 time 变量小的先执行),如果time相同则 先提交的任务会被先执行( ScheduledFutureTask 的 squenceNumber 变量小的先执行)。

执行周期任务步骤:

1. 线程从 DelayQueue 中获取已到期的 ScheduledFutureTask(DelayQueue.take()) 。到期任 务是指 ScheduledFutureTask 的 time 大于等于当前系统的时间;

2. 执行这个 ScheduledFutureTask ;

3. 修改 ScheduledFutureTask 的 time 变量为下次将要被执行的时间;

4. 把这个修改 time 之后的 ScheduledFutureTask 放回 DelayQueue 中( DelayQueue.add() )。

image.png

适用场景:周期性执行任务的场景,需要限制线程数量的场景。

总结-java中常用的线程池类

1. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,线程池中的线程处于一定的量,可以很好的控制线程的并发量

2. newSingleThreadExecutor:创建一个使用单个 worker 线程的Executor ,以无界队列方式来运行 该线程。线程池中最多执行一个线程,之后提交的线程将会排在队列中亿次执行

3. newCachedThreadPool:创建一个可进行缓存重复利用的线程池

4.  newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期的执行

相关文章
|
3月前
|
算法 调度 人工智能
人工智能线程问题之无锁化编程如何解决
人工智能线程问题之无锁化编程如何解决
44 2
|
3月前
|
监控 Java 调度
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
57 1
|
5月前
|
存储 Java
Java 线程池作用及类型
线程池的优势、原理及参数解析 线程池解决了两个不同的问题: 1. 减少线程创建的开销,能提高执行大量异步任务的效率 2. 提供了一种限制和管理资源及线程的方法,并且还维护了一些基本的统计信息(如已完成的任务数) 线程池的使用对`new Thread()`的优势: 1. 复用存在的线程,减少对象创建、消亡的开销,性能佳。 2. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 3. 提供定时执行、定期执行、单线程、并发数控制等功能。
|
Java
线程池的类型有哪些?适用场景?第一篇
线程池的类型有哪些?适用场景?第一篇
168 0
|
安全 Java 容器
并发编程-13线程安全策略之两种类型的同步容器
并发编程-13线程安全策略之两种类型的同步容器
75 0
|
缓存 安全 Java
并发编程-04线程安全性之原子性Atomic包的4种类型详解
并发编程-04线程安全性之原子性Atomic包的4种类型详解
50 0
|
物联网 Linux 开发者
线程的取消类型|学习笔记
快速学习线程的取消类型
线程的取消类型|学习笔记
|
存储 缓存 Java
【Java 并发编程】线程简介 ( 并发类型 | 线程状态 | CPU 数据缓存 )
【Java 并发编程】线程简介 ( 并发类型 | 线程状态 | CPU 数据缓存 )
152 0
【Java 并发编程】线程简介 ( 并发类型 | 线程状态 | CPU 数据缓存 )
|
14天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

热门文章

最新文章