加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JAVA并发工具类---------------(CyclicBarrier)

发布时间:2020-12-15 07:44:19 所属栏目:Java 来源:网络整理
导读:CyclicBarrier简介 CyclicBarrier,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。 所谓Cyclic即 循环 的意思,所谓Barrier即 屏障 的意思。 所以综合起来,CyclicBarrier指的就是 循环屏障,虽然这个叫法很奇怪,但是确能很好地表示它的作

CyclicBarrier简介

CyclicBarrier,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。

所谓Cyclic即 循环 的意思,所谓Barrier即 屏障 的意思。

所以综合起来,CyclicBarrier指的就是 循环屏障,虽然这个叫法很奇怪,但是确能很好地表示它的作用。



CyclicBarrier方法说明

——CyclicBarrier(parties)

  初始化相互等待的线程数量的构造方法。

——CyclicBarrier(parties,Runnable barrierAction)

  初始化相互等待的线程数量以及屏障线程的构造方法。

屏障线程的运行时机:等待的线程数量=parties之后,CyclicBarrier打开屏障之前。

举例:在分组计算中,每个线程负责一部分计算,最终这些线程计算结束之后,交由屏障线程进行汇总计算。

——getParties()

  获取CyclicBarrier打开屏障的线程数量,也成为方数。

——getNumberWaiting()

  获取正在CyclicBarrier上等待的线程数量。

——await()

  在CyclicBarrier上进行阻塞等待,直到发生以下情形之一:

  • 在CyclicBarrier上等待的线程数量达到parties,则所有线程被释放,继续执行。
  • 当前线程被中断,则抛出InterruptedException异常,并停止等待,继续执行。
  • 其他等待的线程被中断,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
  • 其他等待的线程超时,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
  • 其他线程调用CyclicBarrier.reset()方法,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。

——await(timeout,TimeUnit)

  在CyclicBarrier上进行限时的阻塞等待,直到发生以下情形之一:

  • 在CyclicBarrier上等待的线程数量达到parties,则所有线程被释放,继续执行。
  • 当前线程被中断,则抛出InterruptedException异常,并停止等待,继续执行。
  • 当前线程等待超时,则抛出TimeoutException异常,并停止等待,继续执行。
  • 其他等待的线程被中断,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
  • 其他等待的线程超时,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
  • 其他线程调用CyclicBarrier.reset()方法,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。

——isBroken()

  获取是否破损标志位broken的值,此值有以下几种情况:

  • CyclicBarrier初始化时,broken=false,表示屏障未破损。
  • 如果正在等待的线程被中断,则broken=true,表示屏障破损。
  • 如果正在等待的线程超时,则broken=true,表示屏障破损。
  • 如果有线程调用CyclicBarrier.reset()方法,则broken=false,表示屏障回到未破损状态。

——reset()

  使得CyclicBarrier回归初始状态,直观来看它做了两件事:

  • 如果有正在等待的线程,则会抛出BrokenBarrierException异常,且这些线程停止等待,继续执行。
  • 将是否破损标志位broken置为false。

?

CyclicBarrier方法练习

主线程

package CyclicBarrierTest;


import javafx.concurrent.Worker;

import java.util.concurrent.CyclicBarrier;

/**
* @Description:
* @Param:
* @return:   一个会议要等10个人都在的时候才能开始开
* @Date: 2019/9/17
*/
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier=new CyclicBarrier(10);

        for (int i = 0; i < 10; i++) {
            System.out.println("开始进场" + i);
            People people = new People(cyclicBarrier);
            new Thread(people).start();
        }

    }
}

?

人员类

package CyclicBarrierTest;

import java.util.concurrent.CyclicBarrier;

public class People implements Runnable {

    private CyclicBarrier cyclicBarrier;

    public People(CyclicBarrier cyclicBarrier) {
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + "进成功开始等待其他人,当前有"+cyclicBarrier.getNumberWaiting()+"人在等待");
            cyclicBarrier.await();
            System.out.println(Thread.currentThread().getName() + "开始开会");
            // 工作线程开始处理,这里用Thread.sleep()来模拟业务处理
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + "开会完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

?

执行结果

D:javajdk1.8binjava.exe "-javaagent:D:ideaaIntelliJ IDEA 2018.1.2libidea_rt.jar=57236:D:ideaaIntelliJ IDEA 2018.1.2bin" -Dfile.encoding=UTF-8 -classpath D:javajdk1.8jrelibcharsets.jar;D:javajdk1.8jrelibdeploy.jar;D:javajdk1.8jrelibextaccess-bridge-32.jar;D:javajdk1.8jrelibextcldrdata.jar;D:javajdk1.8jrelibextdnsns.jar;D:javajdk1.8jrelibextjaccess.jar;D:javajdk1.8jrelibextjfxrt.jar;D:javajdk1.8jrelibextlocaledata.jar;D:javajdk1.8jrelibextnashorn.jar;D:javajdk1.8jrelibextsunec.jar;D:javajdk1.8jrelibextsunjce_provider.jar;D:javajdk1.8jrelibextsunmscapi.jar;D:javajdk1.8jrelibextsunpkcs11.jar;D:javajdk1.8jrelibextzipfs.jar;D:javajdk1.8jrelibjavaws.jar;D:javajdk1.8jrelibjce.jar;D:javajdk1.8jrelibjfr.jar;D:javajdk1.8jrelibjfxswt.jar;D:javajdk1.8jrelibjsse.jar;D:javajdk1.8jrelibmanagement-agent.jar;D:javajdk1.8jrelibplugin.jar;D:javajdk1.8jrelibresources.jar;D:javajdk1.8jrelibrt.jar;E:gyftargetclasses CyclicBarrierTest.CyclicBarrierDemo
开始进场0
开始进场1
开始进场2
开始进场3
开始进场4
开始进场5
开始进场6
开始进场7
开始进场8
开始进场9
Thread-0进成功开始等待其他人,当前有0人在等待
Thread-4进成功开始等待其他人,当前有1人在等待
Thread-8进成功开始等待其他人,当前有2人在等待
Thread-1进成功开始等待其他人,当前有3人在等待
Thread-5进成功开始等待其他人,当前有4人在等待
Thread-9进成功开始等待其他人,当前有5人在等待
Thread-3进成功开始等待其他人,当前有6人在等待
Thread-7进成功开始等待其他人,当前有7人在等待
Thread-2进成功开始等待其他人,当前有8人在等待
Thread-6进成功开始等待其他人,当前有9人在等待
Thread-6开始开会
Thread-0开始开会
Thread-4开始开会
Thread-8开始开会
Thread-1开始开会
Thread-5开始开会
Thread-9开始开会
Thread-3开始开会
Thread-7开始开会
Thread-2开始开会
Thread-6开会完毕
Thread-7开会完毕
Thread-2开会完毕
Thread-4开会完毕
Thread-0开会完毕
Thread-3开会完毕
Thread-5开会完毕
Thread-8开会完毕
Thread-9开会完毕
Thread-1开会完毕

Process finished with exit code 0

?

上面是模拟10个人一起开会的情况,当第一个线程到最后第一个线程开始执行后,都会等待后续线程到达cyclicBarrier.await()时会停驶当前线程的任务,当所有线程执行到await时,并行开始进行下一布任务

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读