简单了解JDK1.8的5种线程池

本文深入探讨了线程池的各种参数设置,包括核心线程数、最大线程数、线程存活时间及队列类型等,并针对不同场景提供了优化建议,避免因参数不当导致的内存溢出等问题。

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

线程池构造函数
 核心线程最大线程线程存活时间队列
FixThreadPool?等于核心线程数永久LinkBlockingQuque
SingleThreadPool11永久LinkBlockingQuque
CacheThreadPool?Integer.MAX_VALUE60秒SynchronousQueue
ScheduledThreadPool?Integer.MAX_VALUE永久DelayedWorkQueue
WorkStealingPool可用CPU核心数  

内部类WorkQueue

 

我们在初始化线程池时经常用以下写法(不优雅):

ExecutorService executorService = Executors.newFixedThreadPool(8);

如果该线程池使用场景,task无限多,会造成一个什么问题?

很显然LinkBlockingQueue队列长度我们没有赋值,他会默认Integer.MAX_VALUE,可能会由于队列中待执行任务过多而发生Out_of_Memory

CacheThreadPool与ScheduledThreadPool由于最大线程数为Integer.MAX_VALUE,亦有可能Out_Of_Memory

建议写法

//创建固定长度线程池、单线程池
ExecutorService executorService = new ThreadPoolExecutor(1,1,0L,
                TimeUnit.MICROSECONDS,new LinkedBlockingQueue<>(2));

//创建可变长度线程池
 ExecutorService executorService = new ThreadPoolExecutor(0,2,30L,
                TimeUnit.DAYS,new SynchronousQueue<Runnable>(true)); 

//创建延迟(定时)线程池
ExecutorService executorService = new ThreadPoolExecutor(1,5,0L,
                TimeUnit.MICROSECONDS,new DelayedWorkQueue<>(5));


//创建workStealing线程池,我更喜欢叫他任务份发线程池
 ForkJoinPool forkJoinPool =  new ForkJoinPool(7,
                ForkJoinPool.defaultForkJoinWorkerThreadFactory,null, true);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值