マルチスレッドと並行性の高い、9-スレッドプール2

キュータスレッドプール工場(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(の数)、最後のスタート()

公開された25元の記事 ウォンの賞賛0 ビュー578

おすすめ

転載: blog.csdn.net/RaymondCoder/article/details/105139058