我们知道提交任务到线程池有两种方法,一种是execute,一种是submit
❝
这两种提交方式占用的内存是一样大的吗?一个空任务究竟占多少内存?
❞
通过源码分析一下
execute
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(8, 8, 15, TimeUnit.MINUTES, newLinkedBlockingQueue < > (), newThreadPoolExecutor.
CallerRunsPolicy())
;
for (int i = 0; i < (int) 2e5; i++) {
int finalI = i;
threadPoolExecutor.submit(() -> {
//乱写...//
int p = finalI;
LockSupport.park();
});
}
LockSupport.park();
}
如果在lambda中没有使用到上下文的其他变量时,是不会重复创建lambda实例的,只会创建一个

只会创建一个lambda实例

如果配合上ArrayBlockingQueue以及execute,提交20w个任务的空间复杂度可以降至O(1)
因为20w个任务的实例都是同一个

总结
如果是lambda中没有上下文变量,使用的队列是ArrayBlockingQueue,提交方式是execute,那么空间复杂度可以达到O(1);如果lambda中有上下文变量,每次提交任务都会创建一个新的lambda实例;
如果使用的队列是LinkedBlockingQueue,那么还要算上LinkedBlockingQueue的Node实例的开销;如果提交的方式是submit,那么还要算上FutureTask和RunnableAdapter的开销
当然这里只是浅层地讨论了一下创建一个空任务所占用的内存大小,如果是更加复杂的任务,任务内的内存开销需要算上
如果错误,请斧正
来源:juejin.cn/post/7284158980113350691
构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以
交流技术、职位内推、行业探讨为主
广告人士勿入,切勿轻信私聊,防止被骗

加我好友,拉你进群

本篇文章来源于微信公众号: Java面试题精选
微信扫描下方的二维码阅读本文

Comments NOTHING