回答
Executors
是 Java 并发包里面提供的一个用于创建 Java 线程池的工具类,它提供了一个些工厂方法用于创建常见的线程池,给我们带来了一定程度上的遍历,但是为什么不推荐时间呢?主要有两个原因:
一、任务队列没有设置固定容量大小
newFixedThreadPool()
和 newSingleThreadExecutor()
,他们在创建线程池时使用的是无界队列 LinkedBlockingQueue。这就意味着当所有线程都在处理任务时,新来的任务会不断地加入到队列中,由于是无界的,所以可以无限制的添加直到系统内存耗尽,从而 OOM。
二、最大线程数量是 Integer.MAX_VALUE
newCachedThreadPool()
使用的一个没有容量的任务队列,提交的任务全部直接交给线程执行,如果没有空闲的线程,则会创建新的线程。所以,如果系统的任务数量非常多,线程池就会创建大量的线程池,再加上,它的最大线程数为 Integer.MAX_VALUE
,无节制地新建线程池会让系统内存耗尽的。
关于这三种类型的线程池可以阅读:线程池有哪几种类型?各有什么优缺点?
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。