CyclicBarrier

CyclicBarrier字面意思是“循环栅栏”,它的作用就是会让所有线程都等待完成后才会继续下一步行动。

举个例子:就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。

CyclicBarrier的构造方法:

public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)
  • parties 是参与线程的个数
  • 第二个构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务

重要方法:

public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException

线程调用 await() 表示自己已经到达栅栏,BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时。

其中注意的是await方法中也是可以含有参数的,timeout表示线程等待的时间数值,unit表示的是时间单位,一般情况下我们调用的是无参方法。

示例代码: 

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {

    static class TaskThread extends Thread{
        CyclicBarrier barrier;
        public TaskThread(CyclicBarrier barrier){
            this.barrier=barrier;
        }

        public void run(){
            try{
                Thread.sleep(1000);
                System.out.println(getName() + " 到达栅栏 A");
                barrier.await();
                System.out.println(getName() + " 冲破栅栏 A");

                Thread.sleep(2000);
                System.out.println(getName() + " 到达栅栏 B");
                barrier.await();
                System.out.println(getName() + " 冲破栅栏 B");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args){
        int threadNum=5;
        CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName()+"完成最后任务");
            }
        });

        for(int i= 0;i

 运行结果:

Thread-4 到达栅栏 A
Thread-3 到达栅栏 A
Thread-2 到达栅栏 A
Thread-0 到达栅栏 A
Thread-1 到达栅栏 A
Thread-1完成最后任务
Thread-1 冲破栅栏 A
Thread-4 冲破栅栏 A
Thread-0 冲破栅栏 A
Thread-3 冲破栅栏 A
Thread-2 冲破栅栏 A
Thread-3 到达栅栏 B
Thread-0 到达栅栏 B
Thread-2 到达栅栏 B
Thread-1 到达栅栏 B
Thread-4 到达栅栏 B
Thread-4完成最后任务
Thread-4 冲破栅栏 B
Thread-3 冲破栅栏 B
Thread-0 冲破栅栏 B
Thread-2 冲破栅栏 B
Thread-1 冲破栅栏 B

从打印结果可以看出,所有线程会等待全部线程到达栅栏之后才会继续执行,并且最后到达的线程会完成 Runnable 的任务。

应用场景:可以用于多线程计算数据,最后合并计算结果的场景。

你可能感兴趣的:(并发编程)