CyclicBarrierを使用すると、要件に最適です。
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierUsage {
private static final int NUMBER_OF_THREADS = 2;
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(NUMBER_OF_THREADS);
Thread t1 = new Thread(new PrimaryParty(barrier));
Thread t2 = new Thread(new PrimaryParty(barrier));
t1.start();
t2.start();
}
}
class PrimaryParty implements Runnable {
private CyclicBarrier barrier;
public PrimaryParty(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
//Statement 1
//Statement 2
//Statement 3
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
//Statement 4
}
}
Javaのスレッド、並行性、同期に関する大きな誤解があると思います。私は[Oracleの同時実行性](https://docs.oracle.com/javase/tutorial/essential/concurrency/)をお勧めします。私があなたに与えることができる唯一の "答え"は、あらかじめコピーして貼り付けることができるプリベークされたコードですが、あなたは何も学ばないでしょう。 – Turing85
はい、できます。 1つの方法は、クラス[java.util.concurrent.CountdownLatch](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html)の使用によるものです。カウント3で作成し、最初の3つのスレッドのそれぞれの終わりにカウントダウンし、4番目のスレッドでゼロに達するのを待ちます。 –
すべてのスレッドがステートメント3を終了するまで、スレッドがステートメント4を開始しないようにすることを意味しますか? –