CyclicBarrier使用

demo1:

package concurrent._Barrier;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Demo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
        for(int i = 0 ;i < 5 ; i ++){
            new Woker(new Integer(i).toString(),cyclicBarrier).start();
        }


    }

}

class Woker extends  Thread{

    private CyclicBarrier cyclicBarrier;
    public Woker(String name,CyclicBarrier cyclicBarrier){
        super(name);
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        String threadName = this.getName();
        try {
            int i = new Random().nextInt(5000);
            Thread.sleep(i);
            System.out.println(threadName + "已经在运行" + i + "ms后到达栅栏");
            cyclicBarrier.await();
            System.out.println(threadName + "继续运行");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

结果:

4已经在运行71ms后到达栅栏
1已经在运行1925ms后到达栅栏
0已经在运行2006ms后到达栅栏
2已经在运行3056ms后到达栅栏
3已经在运行4434ms后到达栅栏
3继续运行
4继续运行
1继续运行
2继续运行
0继续运行

修改代码:

在到达栅栏之后,栅栏随机选取一个线程,进行一个操作。

package concurrent._Barrier;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Demo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"正在执行Runnable");
            }
        });
        for(int i = 0 ;i < 5 ; i ++){
            new Woker(new Integer(i).toString(),cyclicBarrier).start();
        }


    }

}

class Woker extends  Thread{

    private CyclicBarrier cyclicBarrier;
    public Woker(String name,CyclicBarrier cyclicBarrier){
        super(name);
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        String threadName = this.getName();
        try {
            int i = new Random().nextInt(5000);
            Thread.sleep(i);
            System.out.println(threadName + "已经在运行" + i + "ms后到达栅栏");
            cyclicBarrier.await();
            Thread.sleep(1000);
            System.out.println(threadName + "继续运行");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

结果:

4已经在运行1582ms后到达栅栏
0已经在运行1932ms后到达栅栏
1已经在运行1967ms后到达栅栏
2已经在运行2128ms后到达栅栏
3已经在运行3582ms后到达栅栏
3正在执行Runnable
4继续运行
2继续运行
0继续运行
1继续运行
3继续运行

从结果可以看出,在到达栅栏之后,首先执行Runnable中的函数,然后再执行线程中的剩余的操作。

原文地址:https://www.cnblogs.com/da-peng/p/10028675.html