首先先说下我接触到的通过Executors创建线程池的方法有两个,分别是Executors.newFixedThreadPool()和Executors.newSingleThreadExecutor()
那我们分别看下两种方法的底层
可以看到这两个方法的底层都有使用链表阻塞队列,链表和数组不同,链表的长度不固定 所以只是一个无界阻塞队列,当任务不断的添加到队列中时,任务越多占用的内存越多,最终导致耗尽内存
导致OOM(Out Of Memory 内存耗尽)
另外一个原因就是 使用这种方式不能对线程命名,不容易排查问题
所以推荐使用ThreadPoolExecutor来定义线程池