アートのJava並行プログラミング(14)たCountDownLatch

たCountDownLatch

たCountDownLatchは、1つ以上のスレッドが終了するのを他のスレッドを待っていることができます

このような要望がある場合:私たちはより多くのデータが、その後、あなたが複数のスレッドを使用して検討することができますExcelシートを解析する必要があり、各解析シート内のデータを、待ち時間がシートのすべての完了が解決されるまで、プログラムは、分析の迅速な完了が必要です。()メソッドを結合する最も簡単な方法を使用する場合、解析操作シートを完了するために、すべてのスレッドのメインスレッドを待機を達成するために、この需要

public class JoinCountDownLatchTest {
    public static void main(String[] args) throws InterruptedException {
        Thread parser1 = new Thread(new Runnable() {
            @Override
            public void run() {
            }
        });
        Thread parser2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("parser2 finish");
            }
        });
        parser1.start();
        parser2.start();
        parser1.join();    join用于让当前执行线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待。
        parser2.join();
        System.out.println("all parser finish");
    }
}
        while (isAlive()) {
            wait(0);          永远等待下去
        }

スレッドの終了に参加知る、スレッドthis.notifyAll()メソッドが呼び出され、コールのnotifyAll()メソッドは、JVMで容易に入手可能です。

JDK1.5との契約がされたCountDownLatchも達成することができ提供機能、および参加以上の機能に参加

public class CountDownLatchTest {
	CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传n
    static CountDownLatch c = new CountDownLatch(2);
    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(1);
                c.countDown();       调用此方法n就会减1  
                System.out.println(2);
                c.countDown();        由于countDown()可以用到任何地方,所以这里说N个点,可以是n个线程,也可以是1个线程里的n个步骤。用在多个线程时,只需要把这个CountDownLatch的引用传递到线程里即可
            }
        }).start();
        c.await();             会阻塞当前线程,直到n变成0.
        System.out.println("3");
    }
}

もっとゆっくり解析シートのスレッドがある場合は、指定した時間--await(長い時間、TimeUnitで単位)特定の時間のため、この方法が待機して別の方法を待って使用することができますので、我々は、メインスレッドが待っていることができませんでしたそれはもはや、現在のスレッドをブロックしません。同様のアプローチを持って参加。

カウンタがゼロのとき、カウンタが0以上である必要があり、単に現在のスレッドの呼び出しがメソッドを待ってブロックしない、0に等しいです。再初期化又は内部カウンタたCountDownLatchオブジェクトの値を変更することは不可能たCountDownLatch。スレッドが別のスレッドがのawaitメソッドを呼び出して、カウントダウン方式が起こる-前に呼び出します。

公開された24元の記事 ウォンの賞賛1 ビュー537

おすすめ

転載: blog.csdn.net/qq_45366515/article/details/105266397