面试题之使用无界队列的线程池会导致内存飙升吗?

更新时间:2023-07-16 22:09:30 阅读: 评论:0

⾯试题之使⽤⽆界队列的线程池会导致内存飙升吗?
面子工程答案:会;
事假规定
分析:
创建线程池⽅式有如下⼏种:
一年级解决问题
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。

本文发布于:2023-07-16 22:09:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1084276.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:队列   阻塞   线程
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图