CountDownLatchの指示は参照用です。特定のコンテンツは次のとおりです
CountDownLatchは、Java.util.concurrentパッケージの次の同期ツールクラスで、1つ以上のスレッドが他のスレッドで操作のセットが完了するまで待つことができます。
CountDownLatchの使用は非常に簡単です。次の例は、私がオンラインで見たものでもあり、非常に適切です。ここに投稿します。
public class test {public static void main(string [] args){countdownlatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(2); for(int i = 0; i <2; i ++){thread thread = newスレッド(new player(begin、end)); thread.start(); } try {system.out.println( "The Race Begin"); begin.countdown(); end.await(); System.out.println( "The Race End"); } catch(Exception e){e.printstacktrace(); }}}/***プレーヤー*/クラスプレーヤーはrunnable {private countdownlatch begin;プライベートカウントダウンラッチエンド。 player(countdownlatch begin、countdownlatch end){this.begin = begin; this.end = end; } public void run(){try {begin.await(); system.out.println(thread.currentthread()。getname() + "到着!");; end.countdown(); } catch(arturnedexception e){e.printstacktrace(); }}}以下は実行中の結果です
CountDownLatchを使用することで、スレッドの実行順序を制御することがわかります。
上記のコードでは、await()メソッドとcountdown()メソッドを使用します。それぞれの機能を確認しましょう。
最初にawait()メソッドを確認します。メインメソッドでend.await()にコメントしてください。コメントアウト後の実行結果は次のとおりです。
メインスレッドは、競技者を表すスレッドが終了するのを待たず、競争が終わったことを直接発表したことがわかります!最初に終了したゲーム---
ここで見ることができますawait()メソッドにブロッキング効果があることがわかります
第二に、カウントダウンメソッドを確認し、競技者のスレッドのend.countdown()にコメントしましょう。以下は実行中の結果です。
プログラムは実行されており、すべてのプレーヤーがフィニッシュラインに到達しましたが、審判はゲームの終わりを宣伝していません。彼は何を待っていますか?
Countdown()メソッドは、ブロッキングスレッドを目覚める効果があると推測します。
それから、ブロッキングスレッドを目覚めさせる機能があるので、CountDown()メソッドを1回だけ呼び出す場合、ブロックされたメインスレッドを目覚めることはできませんか?
それを試してみましょう、上記のcoutdown()アノテーションを解除して、再びプレーヤーを作成してください、コードは次のとおりです
class player2はrunnable {private countdownLatchを実装します。プライベートカウントダウンラッチエンド。 player2(countdownlatch begin、countdownlatch end){this.begin = begin; this.end = end; } public void run(){try {begin.await(); system.out.println(thread.currentthread()。getname() + "到着!"); // end.countdown(); } catch(arturnedexception e){e.printstacktrace(); }}}主な方法も次のように変更され、2人の異なるプレーヤーを作成します
public static void main(string [] args){countdownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(2);スレッドスレッド= newスレッド(new Player(begin、end)); thread.start();スレッドスレッド2 = newスレッド(new Player2(begin、end)); thread2.start(); try {System.out.println( "The Race Begin"); begin.countdown(); end.await(); System.out.println( "The Race End"); } catch(Exception e){e.printstacktrace(); }}それを実行してください、ここに結果があります
メインプログラムはブロックされており、目覚めていません。審判はしばらくトイレを使用しています!
CountDown()はスレッドを直接目覚めさせないようです。カウンター、カウントダウンのようなものです。
APIドキュメントを確認してください。コンストラクターにパラメーター2を追加しました。CountDown()を2回呼び出して、end.await()のブロックされたスレッドを起動する必要があります。
CountDownLatch end = new CountDownLatch(2);
総括する、
1。CountDownLatchend = new CountDownLatch(n); //オブジェクトを構築するときは、パラメーターnを渡す必要があります。
2。END.AWAIT()は、スレッドがリリースされる前にn回と呼ばれるEnd.countdown()メソッドがリリースされるまでスレッドをブロックできます。
3。End.CountDown()を複数のスレッドで呼び出して、すべてのスレッドの合計である呼び出し数を計算できます。
次のブログでは、ソースコードレベルからCountDownLatchがどのように機能するかを説明します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。