この記事では主に Java ThreadPoolExecutor のパラメータを深く理解するための関連情報を紹介します。必要な方は参考にしてください。スレッドプールを作成する
スレッドを作成する前に ExecutorのnewFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()の3つのメソッドが常に使用されます。もちろん、Executor も new ThreadPoolExecutor に対して異なるパラメーターを使用します
1. newFixedThreadPool()
固定数のスレッドでスレッド プールを作成します。 LinkedBlockingQueueを使用するため、maximumPoolSizeは役に立ちません。 corePoolSizeがいっぱいの場合、LinkedBlockingQueuequeueに追加されます。スレッドが実行を完了するたびに、LinkedBlockingQueue キューから 1 つを取得します。つまり、これは固定サイズのスレッドプールを作成することになります。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
2.newSingleThreadPool()
スレッド番号 1 のスレッド プールを作成します。 LinkedBlockingQueue を使用するため、maximumPoolSize は役に立ちません。 corePoolSize 1 は、スレッドの数が 1 であることを意味します。 いっぱいになると、キューに入れられ、キューから 1 つを取得するだけで実行が完了します。 public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
バッファ可能なスレッドプールを作成します。サイズ制限はありません。 corePoolSize が 0 であるため、タスクは SynchronousQueue キューに入れられます。SynchronousQueue はサイズ 1 しか格納できないため、新しいスレッドがすぐに開始されます。 。メモリサイズによって制限されます。
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
ThreadPoolExecutor の
コンストラクター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.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; }
パラメータ: スレッド数が 2、maximumPoolSize はスレッドの最大数です。スレッド数 >= corePoolSize の場合、ランナブルは workQueue に置かれます。 3. keepAliveTime スレッド数が最大の corePoolSize より大きい場合のキープアライブ時間。アイドル状態のスレッドが存在できる時間。 4. 単位時間単位 5. workQueue はタスクのブロッキングキューを保存します 6. threadFactory はスレッドファクトリーを作成します 7. ハンドラー拒否戦略 1.スレッドが corePoolSize より小さい場合、タスクを実行するためにスレッドが作成されます。 2. スレッド数が corePoolSize 以上で、workQueue が満杯でない場合、workQueue に投入します 3. スレッド数が corePoolSize 以上で、workQueue が満杯の場合、新しいタスクを実行するために新しいスレッドが作成され、スレッドの合計数はmaximumPoolSize 4未満である必要があります。 スレッドの合計数がmaximumPoolSizeに等しく、workQueueがいっぱいの場合、ハンドラーのrejectedExecutionが実行されます。それが拒否戦略です。 1. ThreadPoolExecutor.AbortPolicy() は直接例外をスローします 4. ThreadPoolExecutor.DiscardOldestPolicy() キューの先頭にあるタスクを破棄します RejectedExecutionHandler を継承して拒否ポリシーを記述することもできます rreee。
以上がJava ThreadPoolExecutor パラメータを深く理解するためのサンプル コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。