私はJavaでcountdownLatchを使用する方法を学んでおり、コードで以下に示すように簡単な例を作成しました。
そのメカニズムについて私が学んだことは、1つのスレッドだけが他のスレッドが作業を完了するまで待機するように強制する方法であり、待機していたスレッドは、他のスレッドが終了するとジョブを開始します.
私の質問は、4 つのスレッド 't1、t2、t3、および t4' があり、それらが記載されている順序で開始され、先頭/前のスレッドが終了したときに各スレッドが開始する必要がある場合です。つまり、t2 は t1 を待って t1 が終了したときに開始し、t3 は t2 を待って t2 が終了したときに開始し、t4 は t3 を待って t3 が終了したときに開始します。
1-CountDownLatch と循環バリアを使用してこれを行う方法は?
2- CountDownLatch クラスのコンストラクタに渡される countDown パラメータは、待機しているスレッドの数を表す必要がありますか?
コード:
public class MainClass {
public static void main(String[] args) {
CountDownLatch latch1 = new CountDownLatch(1);
Thread t1 = new Thread(new AscendingOrder(latch1));
Thread t2 = new Thread(new DescendingOrder(latch1));
t1.start();
t2.start();
}
static class AscendingOrder implements Runnable {
private CountDownLatch latch;
public AscendingOrder(CountDownLatch latch) {
// TODO Auto-generated constructor stub
this.latch = latch;
}
public void run() {
// TODO Auto-generated method stub
System.out.println("thread t1 started.");
for (int i = 0; i < 10; i++)
System.out.println(i);
this.latch.countDown();
}
}
static class DescendingOrder implements Runnable {
private CountDownLatch latch;
public DescendingOrder(CountDownLatch latch1) {
// TODO Auto-generated constructor stub
this.latch = latch1;
}
public void run() {
// TODO Auto-generated method stub
System.out.println("thread t2 started and waiting");
try {
this.latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 10; i > 0; i--)
System.out.println(i);
}
}
}