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);
}