屏障同步(输出、增量和等待)

Posted

技术标签:

【中文标题】屏障同步(输出、增量和等待)【英文标题】:Barrier Synchronization (Output, increment and wait) 【发布时间】:2020-01-25 18:53:42 【问题描述】:

我想让同步线程互相等待。在示例程序中,每个线程最多计数为 100。我希望线程每 10 个输出等待一次。

因为我正在准备考试,所以我想使用 CyclicBarrier 方法。

代码如下:

public class NumberRunner extends Thread 

    private int number;

    private CyclicBarrier barrier;

    public NumberRunner(int n, CyclicBarrier b) 
        number = n;
        barrier = b;
    

    public void run() 

        for (int i = 0; i < 100; i++) 

            System.out.println("Thread " + number + ": " + i);
        

    

和主类

public class Barriers 

    private final static int NUMBER = 3;

    public static void main(String[] args) 

        CyclicBarrier barrier = new CyclicBarrier(3);

        NumberRunner[] runner = new NumberRunner[NUMBER];
        for (int i = 0; i < NUMBER; i++) 
            runner[i] = new NumberRunner(i, barrier);
        
        for (int i = 0; i < NUMBER; i++) 
            runner[i].start();
        
    

如何插入障碍?

【问题讨论】:

【参考方案1】:
for (int i = 0; i < 100; i++) 
    System.out.println("Thread " + number + ": " + i);
    if ((i + 1) % 10 == 0) 
        try 
            barrier.await();
         catch () //whatever exceptions b.await() throws
       

【讨论】:

很抱歉,这不是我想要的方式。我希望每个线程运行到 10,然后等到其他线程运行到 10,依此类推... 该死,这看起来很简单。非常感谢。

以上是关于屏障同步(输出、增量和等待)的主要内容,如果未能解决你的问题,请参考以下文章

concurrent同步屏障 CyclicBarrier & 源码分析

AQS同步组件-CyclicBarrier(循环屏障)解析和用例

java 优雅的实现多线程等待,可重用的同步屏障Phaser | Java工具类

使用二进制信号量实现屏障(一种同步结构)

Java并发工具类同步屏障CyclicBarrier

需要关于 pthread 同步的建议/建议(结合使用条件变量和屏障)