2024-08-04
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1790204195

回答

Executors 是 Java 并发包里面提供的一个用于创建 Java 线程池的工具类,它提供了一个些工厂方法用于创建常见的线程池,给我们带来了一定程度上的遍历,但是为什么不推荐时间呢?主要有两个原因:

一、任务队列没有设置固定容量大小

newFixedThreadPool()newSingleThreadExecutor(),他们在创建线程池时使用的是无界队列 LinkedBlockingQueue。这就意味着当所有线程都在处理任务时,新来的任务会不断地加入到队列中,由于是无界的,所以可以无限制的添加直到系统内存耗尽,从而 OOM。

二、最大线程数量是 Integer.MAX_VALUE

newCachedThreadPool() 使用的一个没有容量的任务队列,提交的任务全部直接交给线程执行,如果没有空闲的线程,则会创建新的线程。所以,如果系统的任务数量非常多,线程池就会创建大量的线程池,再加上,它的最大线程数为 Integer.MAX_VALUE,无节制地新建线程池会让系统内存耗尽的。

关于这三种类型的线程池可以阅读:线程池有哪几种类型?各有什么优缺点?