序文:
このテストは先週、開発の同僚によって開発されたモジュールにバグを提起しましたが、それでも偶然でした。
コードを慎重に確認した後、ビジネスでマルチスレッドが有効になっていることがわかり、2つのスレッドが同時に実行されますが、新しく開始された2つのスレッドは、1つが完了し、もう1つがバグを排除するために実行され続ける必要があります。
いつ使用するのですか?
マルチスレッドは多くの場所で使用されますが、特定のスレッドが完了した後に別のスレッドを起動したい場合は、CountDownLatchが役立ちます。
それを使用する方法は?
通常のマルチスレッドコードを見てみましょう。
パッケージコード; public class mythread extends thread {public static void main(string [] args){mythread th = new mythread();スレッドT1 =新しいスレッド(TH、 "Mythread"); t1.start(); system.out.println(thread.currentthread()。getname()); } public void run(){mythread1 th2 = new mythread1();スレッドT2 =新しいスレッド(Th2、 "mythread1"); t2.start(); system.out.println(this.currentthread()。getname()); } class mythread1 extends thread {public void run(){try {thread.sleep(1000); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); } system.out.println(this.currentthread()。getname()); }}}コードは上記の通りです。まず、MythReadを使用してスレッドクラスを継承し、MythReadクラス内に別のMythRead1クラスを作成します。これはスレッドクラスも継承し、実行方法で1秒間眠ります。このようにして、コードが印刷されます:
上記の出力順序から、メインスレッドが最初に開始され、次にMythReadスレッドが開始されることがわかります。 MythReadスレッドでは、MythRead1スレッドが開始されます。ただし、MythRead1スレッドは1秒間眠っていたため、後続のビジネスの処理をシミュレートしたため、MythReadが完了したよりも少し遅くなります。
次に、コードにCountDownLatchを追加し、MythRead1を最初に実行してから、MythReadを実行し続けます。
パッケージコード;インポートjava.util.concurrent.countdownlatch; public class mythread extends thread {countdownlatch countdownlatch = new CountDownLatch(1); public static void main(string [] args){mythread th = new mythread();スレッドT1 =新しいスレッド(TH、 "Mythread"); t1.start(); system.out.println(thread.currentthread()。getname()); } public void run(){mythread1 th2 = new mythread1();スレッドT2 =新しいスレッド(Th2、 "mythread1"); t2.start(); try {countdownlatch.await(); } catch(arturnedexception e){e.printstacktrace(); } system.out.println(this.currentthread()。getname()); } class mythread1 extends thread {public void run(){try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); } system.out.println(this.currentthread()。getname()); CountDownLatch.CountDown(); }}}コード作成方法は上に表示され、ほぼ3つのステップに分かれています
1.最初に新しいCountDownLatchオブジェクトパラメーターを1に設定しましょう(これは新しい配列のようなものであることを個人的に理解しています。配列がクリアされると、中断されたスレッドが実行され続けることができます)
2。MythReadクラスでCountDownLatch.Await()を呼び出します。現在のスレッドの実行を停止します。
3。MythRead1クラスでCountDownLatch.CountDown()メソッドを呼び出します。すべてのmythread1が実行され、メソッドが最終的に呼び出されると、関数は私が言及した「配列」をクリアすることです。
出力の印刷結果をご覧ください
結果は、上記の図に示されているように、予想される結果と一致しています。
最後に、CountDownLatch CountDownLatch = new CountDownLatch(1)について話しましょう。この領域で1を設定するため、CountDownLatch.CountDown()を1回呼び出す必要があります。
それが別の数値である場合、対応する回数を呼び出す必要があります。そうしないと、スレッド呼び出しCountDownLatch.await()は実行されません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。