戳上方蓝字“Java面试题精选”关注我!

我们知道提交任务到线程池有两种方法,一种是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,那么还要算上FutureTaskRunnableAdapter的开销

当然这里只是浅层地讨论了一下创建一个空任务所占用的内存大小,如果是更加复杂的任务,任务内的内存开销需要算上

如果错误,请斧正

来源:juejin.cn/post/7284158980113350691
后端专属技术群

构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

文明发言,以交流技术职位内推行业探讨为主

广告人士勿入,切勿轻信私聊,防止被骗

加我好友,拉你进群

本篇文章来源于微信公众号: Java面试题精选



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-08-02