java中的线程池实现有哪些?FixedThreadPool底层使用的是什么任务队列

本文详细介绍了四种线程池:newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool和newScheduleThreadPool的工作原理及适用场景。探讨了线程池大小的确定方法,并分析了并发库中的blockingqueue,包括其put()和take()方法的使用。文章还对比了几种线程池使用的队列类型,如有界队列、无界队列、直接提交队列和优先任务队列。

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

四种线程池:
1.newFixedThreadPool()方法:该方法返回一个固定线程数量的线程池。线程池中的线程数量始终不变,当新任务提交若有空闲线程则立即执行,没有,则新的任务会暂存在一个任务队列中,待有线程空闲时,便处理任务队列中的任务。
2.newSingleThreadExecutor()方法:该方法返回一个只有一个线程的线程池。该任务队列是一个先进先出的顺序执行队列。
3.newCachedThreadPool()方法:该方法返回一个根据实际情况调整线程数量的线程池。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务,用完完毕放回线程池复用。
4.newScheduleThreadPool()方法:创建固定长度的线程池,且同时以延时或者定时的方法执行任务。

如何确定线程池大小(cpu密集型通常设置Ncpu+1,io密集型数量设置的应该更多)

并发库中的blockingqueue(阻塞队列),主要提供了两个方法put()和take()
前者将对象放到队列中,如果队列已满,就等待有空闲。后者从head取一个对象,如果没有对象就等到有对象。
FixedThreadPool与SingleThreadPool都是采用的无界linkedblockingqueue实现。linkedblockingqueue中引入了两把锁takelock和putlock,显然分别用于take操作和put操作。入队出队用不同锁,可以同时进行入队出队操作。由于其实链表,查找较慢。

CacheThreadPool使用的时synchronousqueue队列,该队列是一种直接提交队列。

线程池主要使用的队列分几种
有界队列
无界队列
直接提交队列
优先任务队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值