JAvaでExecutorsがスレッドプールを作成する3つの方法
11543 ワード
3つのキースレッドプールの比較
1.単一スレッドの作成(一例モード)
呼び出されたThreadPoolExecutorの構築方法のコアプールサイズと最大スレッドプールはいずれも1であるため、スレッドプールには1つのスレッドしか存在しない.
2、固定サイズのスレッドプールを作成する
スレッドプールを作成する方法は、スレッドプールのコアサイズと最大容量、すなわちスレッドプールの固定サイズを設定できる授業伝達パラメータ
3、伸縮可能なスレッドプール
ここでの最大スレッドサイズは
これらの方法で作成されたスレッドプールは、ThreadPoolExecutorオブジェクトを作成することによって実現されます.
4、ThreadPoolExecutor
この3つのスレッドプールの作成時に呼び出されるThreadPoolExecutorの構築方法を見てみましょう
ここで呼び出されたthisメソッドを見てみましょう
これらの方法は本質的にThreadPoolExecutorを呼び出す構造方法であることを示した.
注意:Executorsでスレッドプールを作成すると便利ですが、アリが発表したJava開発マニュアルでは、スレッドプールはExecutorsで作成できないように強制されていますので、ThreadPoolExecutorでスレッドプールを作成することをお勧めします.
ThreadPoolExecutorスレッドプールリファレンスの作成https://blog.csdn.net/jjj___jjj/article/details/105314542
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