前言

创建线程池最好不要使用Executors去创建,而是通过ThreadPoolExecutor的方式创建,通过这样子的创建方式,写的人就更加清楚线程池内部的运行规则,可以尽量避免内存溢出的情况。


Executors创建线程池的缺点

阅读下面的源码就可以发现,通过Executors创建线程池,内部仍然是通过ThreadPoolExecutor创建的,只不过人家帮你写好了参数。

newFixedThreadPool

作用:该方法返回一个固定线程数量的线程池,线程数量自定义。该方法创建的线程池最大线程数量等于核心线程数量。如果新提交的任务没有空闲的线程去处理,就会被放入阻塞队列中。

缺点:该线程池使用的阻塞队列是LinkedBlockingQueue:链表阻塞队列,默认容量为Integer.MAX_VALUE,容量过大,可能会堆积大量的任务,从而造成OOM(内存溢出)

java线程池全局变量还是局部线程池 java线程池缺点_java


newSingleThreadExecutor

作用:该方法创建了只有一个线程的线程池,如果提交的任务没有空闲的线程去处理,就会被放入阻塞队列中

缺点:该线程池使用的阻塞队列是LinkedBlockingQueue:链表阻塞队列,默认容量为Integer.MAX_VALUE,容量过大,可能会堆积大量的任务,从而造成OOM(内存溢出)

java线程池全局变量还是局部线程池 java线程池缺点_多线程_02

newCachedThreadPool

作用:该方法返回一个可根据实际需求调整线程数量的线程池。如果提交的任务没有空闲的线程处理,就会创建新的线程去处理该任务。如果有线程空闲时间超过60秒,就会被销毁

缺点:该线程池允许创建的最大线程数量为Integer.MAX_VALUE,可能会创建出大量线程,导致OOM(内存溢出)

java线程池全局变量还是局部线程池 java线程池缺点_java线程池全局变量还是局部线程池_03


newScheduleThreadPool

作用:该方法可以创建自定义核心线程容量的线程池,而且该线程池支持定时以及周期性的任务执行。

缺点:该线程池允许创建的最大线程数量为Integer.MAX_VALUE,可能会创建出大量线程,导致OOM(内存溢出)

java线程池全局变量还是局部线程池 java线程池缺点_java_04

最后

通过上述缺点的分析,所以线程池最好还是自己通过ThreadPoolExecutor来创建,自己定义好线程池的参数,这样自己也清楚线程池的运行规则,避免发生内存溢出的情况。