JAVAマルチスレッドCountDownLatch使用詳細
3690 ワード
前の順序:
先週、開発した同僚が開発したモジュールにバグを提出しました。
コードをよく調べてみると、業務でマルチスレッドを有効にし、2スレッドを同時に実行していますが、新たに起動する2つのスレッドは完成した後、もう1つのスレッドが再起動してこそ、バグを解消することができます。
いつ使いますか?
マルチスレッドは多くのところで使われていますが、私たちはある特定のスレッドを実行した後、もう一つのスレッドを起動したいです。この時、CountDownLatchが役に立ちます。
どう使いますか?
まず普通のマルチスレッドコードを見てください。
上記の出力順序からは、まずメインスレッドを起動してからMyThreadスレッドを起動し、MyThreadスレッドの中でMyThread 1スレッドを起動したことが分かります。しかし、MyThread 1スレッドを1秒寝かせたので、その後の業務をシミュレーションして処理すると、MyThreadの運転が完了した時間より少し遅くなります。
現在、コードにCountDownLatchを入れて、MyThread 1を先に運転してから、MyThreadを実行させます。
1、私たちはまずnew CountDownLatchのオブジェクトを1に設定します。(私の個人的にはこれはnewの配列のようです。いつ配列が空になりますか?中断されたスレッドを続行します。)
2、MyThread類でcountDownLatch.await()を呼び出します。現在のスレッドを停止させます。
3、Mythread 1クラスでcountDownLatDownメソッドを呼び出します。Mythread 1が全部実行されたら、最後にこの方法を呼び出すと、私が言った「配列」を空にする役割があります。
出力の印刷結果を見てください。
結果は上の図のように、予想通りの結果です。
最後にCountDownLatch countDownLatch=new CountDownLatch(1)の入力を言います。この設定は1です。countDownLatch.comを一回呼び出す必要があります。
他の数字であれば、該当回数を呼び出します。そうでなければ、countDownLatch.awaitを呼び出すスレッドは実行されません。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
先週、開発した同僚が開発したモジュールにバグを提出しました。
コードをよく調べてみると、業務でマルチスレッドを有効にし、2スレッドを同時に実行していますが、新たに起動する2つのスレッドは完成した後、もう1つのスレッドが再起動してこそ、バグを解消することができます。
いつ使いますか?
マルチスレッドは多くのところで使われていますが、私たちはある特定のスレッドを実行した後、もう一つのスレッドを起動したいです。この時、CountDownLatchが役に立ちます。
どう使いますか?
まず普通のマルチスレッドコードを見てください。
package code;
public class MyThread extends Thread {
public static void main(String[] args) {
MyThread th = new MyThread();
Thread t1 = new Thread(th, "Mythread");
t1.start();
System.out.println(Thread.currentThread().getName());
}
public void run()
{
Mythread1 th2 = new Mythread1();
Thread t2 = new Thread(th2, "Mythread1");
t2.start();
System.out.println(this.currentThread().getName());
}
class Mythread1 extends Thread
{
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.currentThread().getName());
}
}
}
コードは上記の通り、先にMyThreadでThread類を継承し、MyThread類の内部にMyThread 1類を書きました。同様にThread類を継承し、run方法で1秒眠らせます。このようにコードを実行すると、プリントされます。上記の出力順序からは、まずメインスレッドを起動してからMyThreadスレッドを起動し、MyThreadスレッドの中でMyThread 1スレッドを起動したことが分かります。しかし、MyThread 1スレッドを1秒寝かせたので、その後の業務をシミュレーションして処理すると、MyThreadの運転が完了した時間より少し遅くなります。
現在、コードにCountDownLatchを入れて、MyThread 1を先に運転してから、MyThreadを実行させます。
package code;
import java.util.concurrent.CountDownLatch;
public class MyThread extends Thread {
CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) {
MyThread th = new MyThread();
Thread t1 = new Thread(th, "Mythread");
t1.start();
System.out.println(Thread.currentThread().getName());
}
public void run()
{
Mythread1 th2 = new Mythread1();
Thread t2 = new Thread(th2, "Mythread1");
t2.start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.currentThread().getName());
}
class Mythread1 extends Thread
{
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.currentThread().getName());
countDownLatch.countDown();
}
}
}
コードの書き方は上のように大体3段階に分けます。1、私たちはまずnew CountDownLatchのオブジェクトを1に設定します。(私の個人的にはこれはnewの配列のようです。いつ配列が空になりますか?中断されたスレッドを続行します。)
2、MyThread類でcountDownLatch.await()を呼び出します。現在のスレッドを停止させます。
3、Mythread 1クラスでcountDownLatDownメソッドを呼び出します。Mythread 1が全部実行されたら、最後にこの方法を呼び出すと、私が言った「配列」を空にする役割があります。
出力の印刷結果を見てください。
結果は上の図のように、予想通りの結果です。
最後にCountDownLatch countDownLatch=new CountDownLatch(1)の入力を言います。この設定は1です。countDownLatch.comを一回呼び出す必要があります。
他の数字であれば、該当回数を呼び出します。そうでなければ、countDownLatch.awaitを呼び出すスレッドは実行されません。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。