介绍
Executors: 对 ThreadPoolExecutor
和ScheduledThreadPoolExecutor
封装的工具类,方便创建线程池。
但是《阿里巴巴Java开发手册》中有要求:
【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
所以不建议使用
Executors
类,直接使用ThreadPoolExcutor
类有助于我们更明确底部规则,规避风险。
常用的几个方法:
Executors.newFixedThreadPool(int nThreads);
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
创建一个有固定线程数的线程池,如果任务数大于了最大线程数,则其它任务将在队列中排列等待。
不过该队列new LinkedBlockingQueue<Runnable>()
的长度为 Integer.MAX_VALUE
,极端情况下,可能会推积大量请求,从而导致OOM。
Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
只会创建一条工作线程处理任务,不过该队列new LinkedBlockingQueue<Runnable>()
的长度为 Integer.MAX_VALUE
,极端情况下,可能会推积大量请求,从而导致OOM。
和 Executors.newFixedThreadPool(int nThreads)
不完全一样,可参考这篇文章《关于SingleThreadExecutor以及FinalizableDelegatedExecutorService》
Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
创建一个有60s缓存的线程池。该线程可以根据需要智能的创建新的线程,或者重用空闲但未过缓存期的线程。
如果线程池中有超过缓存期的线程(60s不执行任务),该闲置的线程将会被终止并从线程池中移除。
不过,该线程池的最大线程数量是 Integer.MAX_VALUE
,极端情况下,可能会推积大量请求,从而导致OOM。
Executors.newScheduledThreadPool(int corePoolSize);
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
不过,该线程池的最大线程数量是 Integer.MAX_VALUE
,极端情况下,可能会推积大量请求,从而导致OOM。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。