当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选面试题-为什么不建议使用Executors来创建线程池?

金三银四精选面试题-为什么不建议使用Executors来创建线程池?

来源:图灵教育
时间:2023-11-13 09:48:14
 

为什么不建议使用Executors来创建线程池?

薪资:10k-20k

岗位:中级开发工程师

1. FixedThreadPool

当我们使用Executors创建FixedThreadPool时,对应的构造方法为:

public static ExecutorService newFixedThreadPool(int nThreads) {
	return new ThreadPoolExecutor(nThreads, nThreads,
								  0L, TimeUnit.MILLISECONDS,
								  new LinkedBlockingQueue<Runnable>());
}

发现创建的队列为LinkedBlockingQueue,是一个无界阻塞队列,如果使用该线程池执行任务,如果任务过多就会不断的添加到队列中,任务越多占用的内存就越多,最终可能耗尽内存,导致OOM。

 

2. SingleThreadExecutor

当我们使用Executors创建SingleThreadExecutor时,对应的构造方法为:

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

也是LinkedBlockingQueue,所以同样可能会耗尽内存。

总结

除开有可能造成OOM之外,我们使用Executors来创建线程池也不能自定义线程的名字,不利于排查问题,所以建议直接使用ThreadPoolExecutor来定义线程池,这样可以灵活控制。