我正在尝试使用 CyclicBarrier
模拟铁人三项比赛,但它没有按预期工作,我也不知道为什么。
比赛的每一部分都要等到所有跑者都完成上一部分后,但似乎永远在等待。
这是第一阶段的代码片段:
class Runner implements Runnable
{
private CyclicBarrier bar = null;
private static int runners;
private static double[] time;
private int number;
public static String name;
public Runner(int runners, String name)
{
time = new double[runners];
for (int i=0; i<runners; i++)
time[i] = 0;
this.name= name;
}
public Runner(CyclicBarrier bar, int number)
{
this.bar = bar;
this.number = number;
}
public void run()
{
try { int i = bar.await(); }
catch(InterruptedException e) {}
catch (BrokenBarrierException e) {}
double tIni = System.nanoTime();
try { Thread.sleep((int)(100*Math.random()); } catch(InterruptedException e) {}
double t = System.nanoTime() - tIni;
time[number] += t;
}
}
public class Triatlon
{
public static void main(String[] args)
{
int runners = 100;
CyclicBarrier Finish_Line_1 = new CyclicBarrier (runners);
Runner c = new Runner(runners, "Triatlon");
ExecutorService e = Executors.newFixedThreadPool(runners);
for (int i=0; i<runners; i++)
e.submit(new Runner(Finish_Line_1, i));
System.out.println(Finish_Line_1.getNumberWaiting()); // this always shows 99
try { int i = Finish_Line_1.await(); }
catch(InterruptedException e01) {}
catch (BrokenBarrierException e02) {}
System.out.println("Swimming phase completed");
// here the rest of the competition, which works the same way
}
}
最佳答案
您遇到了一个偏一错误:您为 100 个线程创建了一个 CyclicBarrier
,但执行了 101 个 await
,其中一次性发生在 main 方法中。由于循环屏障的语义,并且受到非确定性条件的影响,您的主线程将最后执行 await
,从而独自等待另外 99 个线程加入。
解决此问题后,您会发现即使完成所有工作,应用程序仍会继续运行。这是因为您没有调用 e.shutdown()
,因此池中的所有线程在主线程完成后仍保持 Activity 状态。
BTW getNumberWaiting
对我来说总是显示 0,这是由于 100 个提交的线程到达屏障而降低后的预期值。然而,这是不确定的,并且可能随时改变。
关于java - CyclicBarrier 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709447/