JAvaでExecutorsがスレッドプールを作成する3つの方法


3つのキースレッドプールの比較
1.単一スレッドの作成(一例モード)
public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

呼び出されたThreadPoolExecutorの構築方法のコアプールサイズと最大スレッドプールはいずれも1であるため、スレッドプールには1つのスレッドしか存在しない.
2、固定サイズのスレッドプールを作成する
public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

スレッドプールを作成する方法は、スレッドプールのコアサイズと最大容量、すなわちスレッドプールの固定サイズを設定できる授業伝達パラメータnThreadsを提供することが分かる.
3、伸縮可能なスレッドプール
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

ここでの最大スレッドサイズはIntegerの最大サイズ2147483647に達することができます.一般的には、私たちはこんなに多くのスレッドを使うことはできません.こんなに多くのスレッドを使うには、強力なハードウェアデバイスのサポートが必要です.スレッドが作成された後、60 sが呼び出されなければ解放されるのを見ることができます.これらのパラメータについては後述します.
これらの方法で作成されたスレッドプールは、ThreadPoolExecutorオブジェクトを作成することによって実現されます.
4、ThreadPoolExecutor
この3つのスレッドプールの作成時に呼び出されるThreadPoolExecutorの構築方法を見てみましょう
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

ここで呼び出されたthisメソッドを見てみましょう
public ThreadPoolExecutor(int corePoolSize,	//        
                          int maximumPoolSize,	//        
                          long keepAliveTime,	//             
                          TimeUnit unit,	//     
                          BlockingQueue<Runnable> workQueue,	//     
                          ThreadFactory threadFactory,	//     ,       
                          RejectedExecutionHandler handler) {//     
    if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)
        throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
        throw new NullPointerException();
    this.acc = System.getSecurityManager() == null ?
        null :
    AccessController.getContext();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

これらの方法は本質的にThreadPoolExecutorを呼び出す構造方法であることを示した.
注意:Executorsでスレッドプールを作成すると便利ですが、アリが発表したJava開発マニュアルでは、スレッドプールはExecutorsで作成できないように強制されていますので、ThreadPoolExecutorでスレッドプールを作成することをお勧めします.
ThreadPoolExecutorスレッドプールリファレンスの作成https://blog.csdn.net/jjj___jjj/article/details/105314542