提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
传统的继承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用于定期或延时执行任务。