java常用线程池及它们的适用场景(JDK1.8)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

传统的继承thread类、实现runnable方式实现多线程,会面临线程反复创建销毁的问题。而线程池最核心的作用就是实现了任务和线程的解绑。使得任务结束之后不会销毁线程。那么java中常用的线程池有哪些呢,它们各自的特点及适用场景又是什么呢。

一、FixedThreadPool

进入Executors类,第一个引入眼帘的就是FixedThreadPool
在这里插入图片描述
可以看到,它的核心线程数和最大线程数是一样的。也就意味着它没有非核心线程,第三个参数表示非核心线程数无任务占用时的存活时间,因为没非核心线程,所以没有意义。第四个参数表示存活时间单位。第五个参数表示阻塞队列类型。通过该阻塞队列长度可知这是个无界队列。
在这里插入图片描述
无界的阻塞队列,就意味着它会有内存溢出的风险。适用于任务量固定耗时长的任务。

二、singleThreadPool

在这里插入图片描述
核心线程和最大线程都为1,表示同一时刻最多只会有一个线程。适用于多个任务顺序使用的场景。

三、CachedThreadPool

在这里插入图片描述
没有核心线程,最大线程数无界。意味着所有线程都是非核心线程,线程闲置60秒后会销毁线程。SynchronousQueue是个长度为0的阻塞队列。如果存在大量长时的任务,会导致cpu占用率百分百,所以它适合任务量大但耗时少的任务。

四、ScheduledThreadPool

在这里插入图片描述
在这里插入图片描述
可以看到,ScheduledThreadPool核心线程数为用户自定义,最大线程数无限制,非核心线程数一空闲立刻销毁。队列采用了一个可对任务按延时时间进行排序的队列,延时时间越短排在最前。这也是个无界队列。这种线程池适合固定周期的定时任务或重复任务。但无界的队列和无限制的最大线程数,意味着它会出现内存溢出和cpu占用率百分百的问题。
点入super()
在这里插入图片描述
可以看出,FixedThreadPool、singleThreadPool、CachedThreadPool和ScheduledThreadPool都是返回的threadpoolexecutor对象。

五、SingleThreadScheduledExecutor

在这里插入图片描述
是个核心线程数为1的ScheduledThreadPool,也就是ScheduledThreadPool的一个特例。用于定期或延时执行任务。

总结

FixedThreadPool适用于任务量固定耗时长的任务。singleThreadPool适用于多个任务顺序使用的场景。CachedThreadPool适合任务量大但耗时少的任务。ScheduledThreadPool适合固定周期的定时任务或重复任务。singleThreadScheduledExecutor用于定期或延时执行任务。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值