乐趣区

关于java:Executors线程池工具类

介绍

Executors: 对 ThreadPoolExecutorScheduledThreadPoolExecutor 封装的工具类,不便创立线程池。

然而《阿里巴巴 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。

退出移动版