java ExecutorService的重新认识

深入理解Java线程池的工作机制及避免内存溢出的方法
本文详细解析了Java ExecutorService中的newFixedThreadPool方法的使用误区,通过实例演示了不当使用可能导致的内存溢出问题,并提供了有效解决策略,帮助开发者正确配置线程池大小,避免资源浪费和系统崩溃。

 ExecutorService executorService = Executors.newFixedThreadPool(number)

以前以为上面这句代码控制了executorService的开启的最大线程数,那我就可以毫无顾忌的submit线程了,直到做一个项目老是报内存溢出的错误。百思不得其解。

层层排除,定位到submit的太豪放了,正好要开启的线程中new了好多大的对象,这样每次submit虽然线程运行的个数小于number但是每次submit都会把新的线程排到了队列当中,这样线程个数其实不受number的控制。累计到一定个数后,就会崩掉。


解决办法:

            int threadCount = ((ThreadPoolExecutor)executorService).getActiveCount();
            int threadTotal = ((ThreadPoolExecutor)executorService).getMaximumPoolSize();
            
            if (threadCount >= threadTotal){

                    //不再submit线程了

            }else{             
                    executorService.submit(Thread);              
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值