考虑我有一个如下的run方法,我正在尝试为MyThread创建四个线程。语句1到3可以通过线程或不同方式同时运行。但我希望Statement 4同时由线程执行。我可以在语句4之前汇集所有线程并由所有线程同时执行语句4吗?
class MyThread extends Thread
{
public void run()
{
//Statement 1
//Statement 2
//Statement 3
//Statement 4
}
}
答案 0 :(得分:1)
有几种方法可以做你想要的。也许最简单的方法是使用Java的Future实现。您可以定义一个(或多个)Futures,它们将在不同的线程上执行,阻塞直到它们都完成Future.get(),然后根据结果完成其他任务。
答案 1 :(得分:1)
使用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
}
}