キュータスレッドプール工場(ThreadPoolExecutor)
newSingleThreadPool();
単一スレッドプールは、タスクの実行順序を確保します。これは、タスクキューのスレッドプールとスレッドプールのライフサイクルをカプセル化します。LinkedBlockingQueueを使用することを根底に、最大Integer.MAX_VALUEで、アリ開発者ガイドには拒否戦略を提供しなかったJDKのスレッド・プールを使用することはお勧めしません。
()newCachedThreadPoolは、
コア、スレッドカウントが0である、スレッドの最大数にInteger.MAX_VALUEで、タスクキューはSynchronousQueueあります。
私たちは、新しいスレッドを作成する使命を持っています
newFixedThreadPool();
スレッドプール内の固定長のスレッドは、同じコアスレッドとスレッドの最大数のパラメータ値を通過します。しかしLinkedBlockingQueueも使用します。
(ここでタスクが積層されていないことを保証するために、タスクの数が使用キャッシュ、使用してタスクの比較的安定した数が変動修正、並列に実行される修正された、高効率)
newScheduledThreadPool();
スケジュールされたタスク。遅延遅延キューを使用して、Integer.MAX_VALUEでの最大スレッド。
(タイムフレーム:クォーツ、クーロン)
ForkJoinPool
newWorkStealingPool();(下のパッケージForkJoinPool)
各スレッドは、独自の個別のキューを持っています。現在のキューが空の場合、自分のキューに他のスレッドを盗むためにキューに戻ります。
コントラストThreadPoolExecutorは、タスクキューのタスクを拾うためのスレッドです。
スレッド自体はタスクキューが空の内側である場合にForkJoinPool各スレッドは、独自のタスクキューを維持し、他のスレッドが実行するタスクキューを取るために、アルゴリズム(ロック)を盗む仕事を通じてなります。した分割タスク(フォーク・プロセス)
ForkJoinPool'll実行した後、(プロセスに参加)、そして最後に、親タスクにルートタスクへの最終的な要約をロールアップ
//ForkJoinPool执行需要继承
static class AddTask extends RecursiveAction//无返回值
static class AddTaskRet extends RecursiveTask<Long>//有返回值
ParalleStreamAPI
並列処理API、底層がForkJoinPool使用され
List<Integer> nums = new ArrayList<>();
Random r = new Random();
for(int i=0; i<10000; i++) nums.add(1000000 + r.nextInt(1000000));
nums.parallelStream().forEach(ParallelStreamAPI::doSomeThing);
スレッドプールサイズ
プロセッサの利用率とスレッドプールのサイズは、以下の式を用いて推定することができる
N = NスレッドU-CPUのCPU *(Wが+ 1 / C)
NCPUは、プロセッサコアの数が、によって製造することができるが
Runtime.getRuntime().availableProcessors()
Ucup CPU使用率は、(0-1間)が所望される
待ち時間のWである/ C比(待機、計算)計算時間[CPUをさせるためにどのくらいのスレッド、複数CPU長期使用]
並行して、パラレル
同時実行:タスクが提出され
、並列に:タスク実行
並列処理は、同時のサブセットです
スレッドプールの状態
RUNNING:の実装
SHUTDOWN:停止
STOP:直ちに停止する
片付けを:SHUTDOWN完了は、仕上げされ
TERMINATE:スレッド完全に終了
プールは、実行スレッド()の実行順序
キューにカーネルスレッド、カーネルスレッド全負荷を作成し、キュー完全なアプリケーションスレッドが再度試して、それが失敗した場合、戦略を実行することを拒否しました。
addWorker()、スレッド1、本当のaddWorker(の数)、最後のスタート()