今日は、マルチスレッド化タスクの項目に問題が発生した、グラフィック記述についてどのような:
1.タイムリーなリターン・ミッション・ステータスの必要性のフロントエンド
2.事業の特定のタスクを実行するためにバックグラウンドスレッド、事業が完了した四つの部分、4つの部分で構成さは完全ではありません
3.ビジネスいくつかの時間がかかるで単独マルチスレッドのタスクは、スレッドプールを開いている必要が
4.スレッドプールのスレッドが並列に実行されている主なタスクとサブタスクは、どのように全体のビジネスをスレッドに知っているように完成されるのですか?
まあ、私は最初のタスクで考えが考慮され、タスクはすべてのサブタスクが完了マークすると、すべてのトラフィックのマーカーは、完了状態に達した場合にはリスニングを開始するために開始したときに、リスナースレッドから他のそれぞれの子スレッドビジネスプラスマークを、提供することですタスクが完了しています。
サービスの実装上の問題ありません。ただ、この操作の個別のスレッドがまだ少しショーで開き、メンテナンスサブタスクマークを取得します。真の非常に便利ではありません
ここ最近、それが見たときに、マルチスレッドボルトの使用状況を見て、すぐにルーチンの波を適用することができ感じます
一般的な実現は、最後の子がタスクを完了するために、後続のタスクの前にオープンボルトは、タスクを完了することができ、サブタスクスレッドプールのタスクボルトロックを、となります。
それは非常に簡単ではない、スレッドを聞いて、ビジネスやマークタスクの多くを保存します。
グッドその後、我々は宇宙の残りの部分は、ボルトの基本的な使い方を見て
1.ラッチ(ラッチ)
ラッチ(ラッチ) -各トランザクションの完了後に、複数のスレッドを確保するために、バックの中身を開けていきます、または他のを待っています。
カウンタラッチ(たCountDownLatch) - JDK5 + 1つ以上のスレッドが発生するイベントを待つことができます実装のラッチ内部です。たCountDownLatchカウンタは正の数、有し;カウントダウン() カウンタの減算演算、のawait();ウェイトカウンタ= 0。すべては、カウンタが0または中断やタイムアウト待機中のスレッドになるまでスレッドがブロックします待っています。
主に二つの方法:カウントダウンの方法と待って保存ロックボルトとキーパーが待っています。
静的な無効メインパブリック(String []型引数は)例外:InterruptedException {スロー //宣言、イベントの5倍の数を待つ のawait新しい新たCountDownLatch =(5)されたCountDownLatchを; //待機状態で5つのMyRunnableスレッドをターンを作成して開始 (int型I =のために。1; I <6; I ++){ 新しい新しいスレッド(新しい新しいMyRunnable(のawait、I))();.開始 } のSystem.out.println( "......スレッドを待っているジョブを開始")、 お待ちしております。 await(); System.out.printlnは( "終わり!"); }
プロセスの説明
まだビジネスシナリオのこの種に遭遇していないが、ここでちなみに、フェンス、およびボルトと同様の操作を見つけるために
2.フェンス(CyclicBarrierを)
イベントが発生するまでロックアウトと同様フェンスは、そのスレッドのセットを遮断しました。フェンスとロックアウトの間の主な違いは、すべてのスレッドが継続するために、フェンスの同じ場所に到着しなければならないことです。イベントを待機し、フェンスは、他のスレッドを待っているロックアウト。
大体の意味:ビジネスは、いくつかのスレッドで行う必要があるが、他のタスクを待つために、サブタスクスレッドのいくつかの詳細は、今後の実施を継続するために、指定された場所の後にフェンスに完成されています。フローチャートのない非常に画像が見えるかもしれないが、以下の例では、インターネットから取得され
シーン: そのようABC 3椅子、椅子の足Aは、Bは、椅子の表面を行い、プロポキシ椅子の背を行うのですか。3人が後に行われ、それが椅子に組み立てることができます。、、フェンスが開いているこの時間は、すべてのサブ問題のスレッドが解放され、サブ一連の問題が解決された後ときこれは、並列反復され、多くのサブ問題への問題は、(すべての子スレッドが持っている質問は、()待っています)フェンスの場所は、次の使用を維持することができます。
例としては、次のとおりです:
静的な無効メインパブリック(文字列[]引数)はInterruptedExceptionある{スロー //宣言、待機中のスレッドの3倍の数 CyclicBarrierをCyclicBarrierを=新しい新しいCyclicBarrierを(3); //待機状態3 MyRunnable2スレッドでターン作成開始 新しいスレッド(新しいChairRunnableを。(CyclicBarrierを、 "椅子の足"))スタート(); 新しい新しいスレッド(新しい新しいChairRunnable(CyclicBarrierを、 "椅子の側"))を起動します。(); 新しいスレッド(新しい新しいChairRunnable(CyclicBarrierを新たに、 "椅子の裏")。)を開始( ); }
パブリック静的クラスChairRunnable実装Runnableを{ 民間最終CyclicBarrierをCyclicBarrierを。 民間最終文字列のイベント。 公共ChairRunnable(CyclicBarrierをCyclicBarrierを、文字列のイベント){ this.cyclicBarrier = CyclicBarrierを。 this.event =イベント。 } ます。public void実行(){ 試み{ System.out.printlnは( "开始做【" +イベント+ "】。"); Thread.sleep(新しいランダム()nextInt(10000)。); cyclicBarrier.await(); //等待其他线程完成 }キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); }キャッチ(BrokenBarrierException電子){ e.printStackTrace(); } System.out.println( "[" +イベント+ "]だけでなく、我々はそれを一緒に組み立てるために持っています!"); } }
結果: 椅子の脚の始まりは[]ください。 [戻る]椅子を開始しました。 椅子[の]やって起動します。 良い[の]議長、そして我々はそれを一緒に組み立てます! []椅子の脚が良く、我々はそれを一緒に組み立てます! [戻る]椅子準備ができて、私たちは一緒にそれを組み立てます!
次のようにプロセスは以下のとおりです。