java多线程编程--CyclicBarrier

java多线程编程--CyclicBarrier,第1张

java多线程编程--CyclicBarrier

参考:https://blog.csdn.net/qq_43470725/article/details/120457461
https://blog.csdn.net/tolcf/article/details/50925145

CyclicBarrier

字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

2个构造器:
  • public CyclicBarrier(int parties, Runnable barrierAction) { }

  • public CyclicBarrier(int parties) { }

参数parties指让多少个线程或者任务等待至barrier状态;参数barrierAction为当这些线程都达到barrier状态时会执行的内容。

**CyclicBarrier中最重要的方法就是

await方法

,它有2个重载版本:**

  • public int await() throws InterruptedException,
    BrokenBarrierException { };
  • public int await (long timeout, TimeUnit unit) throws
    InterruptedException,BrokenBarrierException,TimeoutException { };

第一个版本比较常用,用来挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务;

第二个版本是让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务。

概念:
来讲这个同步工具叫CyclicBarrier,意思是循环栅栏,这有一个栅栏,什么时候人满了就把栅栏推倒,哗啦哗啦的都放出去,出去之后扎栅栏又重新起来,再来人,满了,推倒之后又继续。

实例1

案例解析:
下面程序,两个参数,第二个参数不传也是可以的,就是满了之后不做任何事情。第一个参数是20,满了之后帮我调用第二个参数指定的动作,我们这个指定的动作就是一个Runnable对象,打印满人,发车。什么barrier.await()会被放倒,就是等够20个人了,后面也可以写你要做的 *** 作 s。什么时候满了20人了就发车。下面第一种写法是满了之后我什么也不做,第二种写法是用Labda表达式的写法。这个意思就是线程堆满了,我们才能往下继续执行。

package com.example.dtest.threadTest.use;

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

public class CyclicBarrierTest {

    public static void main(String[] args) {

    //CyclicBarrier barrier = new CyclicBarrier(20);

    CyclicBarrier barrier = new CyclicBarrier(20, () -> System.out.println("满人"));

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

        new Thread(()->{
            try {
                barrier.await();

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }).start();
    }

    }

}

案例2

假若有若干个线程都要进行写数据 *** 作,并且只有所有线程都完成写数据 *** 作之后,这些线程才能继续做后面的事情,此时就可以利用CyclicBarrier了:

package com.example.dtest.threadTest.use;

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

public class CyclicBarrierTest01 {

    public static void main(String[] args) {
        int N = 4;
        CyclicBarrier barrier  = new CyclicBarrier(N);
        for(int i=0;i 


CyclicBarrier和CountDownLatch区别:
CyclicBarrier没有可以专门计数的计数器,只有通过awai()方法计算被阻塞的线程数是否到达!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5637171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存