Executors: 对 ThreadPoolExecutor
和ScheduledThreadPoolExecutor
封装的工具类,方便建立线程池。java
可是《阿里巴巴Java开发手册》中有要求:缓存
【强制】线程池不容许使用Executors去建立,而是经过ThreadPoolExecutor的方式,这样的处理方式让写的同窗更加明确线程池的运行规则,规避资源耗尽的风险。因此不建议使用
Executors
类,直接使用ThreadPoolExcutor
类有助于咱们更明确底部规则,规避风险。工具
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
建立一个有固定线程数的线程池,若是任务数大于了最大线程数,则其它任务将在队列中排列等待。线程
不过该队列new LinkedBlockingQueue<Runnable>()
的长度为 Integer.MAX_VALUE
,极端状况下,可能会推积大量请求,从而致使OOM。code
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》资源
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
建立一个有60s缓存的线程池。该线程能够根据须要智能的建立新的线程,或者重用空闲但未过缓存期的线程。
若是线程池中有超过缓存期的线程(60s不执行任务),该闲置的线程将会被终止并从线程池中移除。开发
不过,该线程池的最大线程数量是 Integer.MAX_VALUE
,极端状况下,可能会推积大量请求,从而致使OOM。get
建立一个支持定时及周期性的任务执行的线程池,多数状况下可用来替代Timer类。it
不过,该线程池的最大线程数量是 Integer.MAX_VALUE
,极端状况下,可能会推积大量请求,从而致使OOM。