⾯试题之使⽤⽆界队列的线程池会导致内存飙升吗?
面子工程答案:会;
事假规定
分析:
创建线程池⽅式有如下⼏种:
一年级解决问题
jdk7提供了7个阻塞队列,分别是:
ArrayBlockingQueue:⼀个由数组结构组成的有界阻塞队列
LinkedBlockingQueue:⼀个由链表结构组成的有界阻塞队列
PriorityBlockingQueue:⼀个⽀持优先级排序的⽆界阻塞队列
DelayQueue:⼀个使⽤优先级队列实现的⽆界阻塞队列
SynchronousQueue:⼀个不存储元素的阻塞队列
LinkedTransferQueue:⼀个由链表结构组成的⽆界阻塞队列
LinkedBlockingDueue:⼀个由链表结构组成的双向阻塞队列
本⽂以newFixedThreadPool为例,以下是jdk源码:
public static ExecutorService newFixedThreadPool(int nThreads) {
新生儿睡姿return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
生存日记
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
进货技巧
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
参数说明:
官运亨通的意思corePoolSize:核⼼线程数
maximumPoolSize: 最⼤线程数
keepAliveTime:线程指定时间内获取不到任务,则销毁
unit:时间单位
workQueue:任务队列
线程池⼯作原理图解:
女生练胸LinkedBlockingQueue默认的最⼤任务数量是Integer.MAX_VALUE,⾮常⼤,可以理解为⽆限⼤吧;但是存在这种情况,当每个线程获取到
⼀个任务后,执⾏时间⽐较长,导致workQueue⾥积压的任务越来越多,机器的内存使⽤不停的飙升,最后也会导致OOM。