Executors和ThreadPoolExecutor那种方式创建线程池更好

博客建议在高并发场景下避免使用Executors创建线程池,因为可能导致OOM风险。推荐使用ThreadPoolExecutor直接指定参数,以更好地控制线程池的行为。核心参数包括核心线程数、最大线程数、线程存活时间和阻塞队列大小,这样可以降低资源耗尽的风险。同时提到ScheduledThreadPoolExecutor适用于定时和周期性任务,但同样要注意无界队列可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程池不应使用Executors去创建,而是通过ThreadPoolExecutor的方式。这样的处理方式让写的同学更加明确线程池的运行规则。规避资源耗尽的风险。

executors创建线程池

  • Executors.newFixedThreadPool()

        创建一个定长的线程池,每提交一个任务就创建一个线程,直到达到池的最大长度,这时线程池会保持长度不再变化。虽然线程数量是固定的,但是阻塞队列是无界队列。如果有很多请求积压,阻塞队列越来越长,容易导致OOM。

(无界队列其实是用了默认参数Integer.MAX_VALUE,一般来说,不应该允许那么多请求等待)

  • Executors.newCachedThreadPool()

        创建一个可缓存的线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活的回收空闲的线程,当需要增加时,  它可以灵活的添加新的线程,而不会对池的长度作任何限制无核心线程

(线程数量不固,和newFixedThreadPool一样请求一多,容易OOM)

  • Executors.newScheduledThreadPool()

        创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer

(和newFixedThreadPool类似,支持定时和周期性任务执行,也是无界队列,容易导致OOM)

  •  Executors.newSingleThreadExecutor()

        创建一个单线程化的executor,它只创建唯一的worker线程来执行任务,必须前一项任务执行完毕才能执行后一项。

(核心线程和非核心线程的区别,没有区别,所谓核心线程是指线程不被销毁的数值范围,而哪些线程被销毁是随机的)

概括:

高并发情况无界队列会有OOM的风险,所以推荐做法是使用ThreadPoolExecutor(定时和周期性任务使用ScheduledThreadPoolExecutor)

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, 
long keepAliveTime, TimeUnit unit, 
BlockingQueue<Runnable> workQueue, 
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)

创建一个新的 ThreadPoolExecutor与给定的初始参数和默认线程工厂和拒绝执行处理程序。

corePoolSize 核心线程数量

maximumPoolSize 最大线程数量

keepAliveTime 线程保持时间,N个时间单位

unit 时间单位(比如秒,分)

workQueue 阻塞队列

threadFactory 线程工厂

handler 线程池拒绝策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值