脚本宝典收集整理的这篇文章主要介绍了【260期】Java线程池,这篇能让你和面试官聊了半小时,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
线程池常问问题:
线程池各个参数的作用,简单阐述一下线程池工作流程。 常见的线程池有哪些,分别适用于什么场景? 使用无界队列的线程会导致内存飙升吗?
线程池的好处
线程池的核心参数
无论是创建何种类型线程池(FixedThreadPool、CachedThreadPool…),均会调用ThreadPoolExecutor构造函数。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
几种典型的工作队列:
线程池饱和策略分为以下几种:
线程池的执行流程
当提交一个新任务,线程池的处理流程如下:
几种常用的线程池
SingleThreadExecutor
创建单个线程。它适用于需要保证顺序地执行各个任务;并且在任意时间点,不会有多个线程是活动的应用场景。
SingleThreadExecutor的corePoolSize和maximumPoolSize被设置为1,使用无界队列LinkedBlockingQueue作为线程池的工作队列。
使用场景:串行执行任务
FixedThreadPool
一种线程数量固定的线程池。
corePoolSize等于maximumPoolSize,所以线程池中只有核心线程,使用无界阻塞队列LinkedBlockingQueue作为工作队列
使用场景:适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。
CachedThreadPool
核心线程数为0,线程最大数为Integer.MAX_VALUE,即可以创建无限的非核心线程。使用SynchronousQueue作为线程池的阻塞队列。
使用场景:执行大量短生命周期任务。因为maximumPoolSize是无界的,每次提交任务,都会立即有线程去处理,因此CachedThreadPool适用于处理大量、耗时少的任务。
ScheduledThreadPool
指定核心线程数,线程最大数为Integer.MAX_VALUE,非核心线程存活时间为0,工作队列使用DelayedWorkQueue,所以线程池仅仅包含固定数目的核心线程。
使用场景:周期性执行任务,并且需要限制线程数量的场景
使用无界队列的线程池会导致内存飙升吗?
答案 :会的,newFixedThreadPool使用了无界的阻塞队列LinkedBlockingQueue,如果线程获取一个任务后,任务的执行时间比较长,会导致队列的任务越积越多,导致机器内存使用不停飙升, 最终导致OOM。
吃水不忘挖井人:
|
以上是脚本宝典为你收集整理的【260期】Java线程池,这篇能让你和面试官聊了半小时全部内容,希望文章能够帮你解决【260期】Java线程池,这篇能让你和面试官聊了半小时所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。