使用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
是的,你可以。一種方法是通過使用類[java.util.concurrent.CountdownLatch](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html)。創建它的計數爲3,在前三個線程中每個線程的末尾倒計數,並等待它在第四個線程中達到零。 –
你的意思是你不想讓任何線程啓動語句4,直到所有線程完成語句3? –