java - CyclicBarrier 未按预期工作

标签 java concurrency cyclicbarrier

我正在尝试使用 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/

相关文章:

c++ - 发布者和消费者线程之间通过堆栈共享数据

java - Java中最快的循环同步是什么(ExecutorService vs. CyclicBarrier vs. X)?

java - 使用循环屏障不会等到所有线程完成

java - 在 netbeans 中运行 Web 应用程序

java - 如何使 IntelliJ/Android Studio 中的静态导入更快

concurrency - 太多的 future

python - 如何计算 Django 应用程序每秒的最大请求数?

java - 障碍分解示例

java - 警告无法激活请求的配置文件 "projectname",因为它不存在

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?