java.util.concurrent CyclicBarrier类

CyclicBarrier类:

  原文:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。CyclicBarrier支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

  说人话:它可以让多个线程阻塞,调用CyclicBarrier的await()方法让线程一直在等待,直到所有线程都到达屏障后再唤醒。

  CyclicBarrier提供2个构造方法:

    CyclicBarrier(int parties)

    CyclicBarrier(int parties, Runnable barrierAction)

  下面的例子使用第二个构造方法,模拟10个狙击手分别就位,如果10个狙击手都已经就位完毕,则报告给指挥官,指挥官下达命令后才能进行射击。

public class Demo {

    public static void main(String[] args) {

        //定义10个狙击手
        int threadNum = 10;

        //实例化一个CyclicBarrier(循环屏障)
        CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum, new Runnable(){
            @Override
            public void run(){
                System.out.println("负责人:报告指挥官,所有狙击手已就位完毕。");
                System.out.println("指挥官:行动!");
            }
        });

        //模拟加入10个线程
        for(int i=1; i<=threadNum; i++){
            new Thread(new Sniper(cyclicBarrier, "狙击手" + i + "号")).start();
        }
    }
}

  定义一个狙击手的类,并实现Runnable接口。

public class Sniper implements Runnable {

    private CyclicBarrier cyclicBarrier;
    private String name;

    public Sniper(CyclicBarrier cyclicBarrier, String name){
        this.cyclicBarrier = cyclicBarrier;
        this.name = name;
    }

    @Override
    public void run() {
        try {

            //随机0-10秒模拟狙击手就位需要的时间
            Random ran = new Random();
            int millisecond = (ran.nextInt(10) + 1);
            int second = millisecond * 1000;
            Thread.sleep(second);

            //准备好之后,报告已就位
            System.out.println( name + ":已就位,用时" + millisecond + "秒。");

            //调用cyclicBarrier.await()方法进行等待
            cyclicBarrier.await();

            //狙击手打击目标
            System.out.println( name + ":报告," + (millisecond % 2 == 1 ? "已击毙敌人。" : "未命中。"));

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

  效果如下:

时间: 2024-10-08 12:05:13

java.util.concurrent CyclicBarrier类的相关文章

java.util.concurrent.CountDownLatch类基本用法

java.util.concurrent.CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行. 1.构造方法参数指定了计数的次数 2.countDown方法,当前线程调用此方法,则计数减一 3.awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 package cn.baokx; import java.util.Random; i

使用java.util.concurrent.ThreadFactory类创建线程

工厂设计模式是Java中最常用的设计模式之一.它是一种创建型设计模式,能够用于创建一个或多个类所需要的对象.有了这个工厂,我们就能集中的创建对象. 集中创建方式给我们带来了一些好处,例如: 1. 能够很容易的改变类创建的对象或者创建对象的方式: 2. 能够很容易限制对象的创建,例如:我们只能为a类创建N个对象: 3. 能够很容易的生成有关对象创建的统计数据. 在Java中,我们通常使用两种方式来创建线程:继承Thread类和实现Runnable接口.Java还提供了一个接口,既ThreadFac

java.util.concurrent常用类(CountDownLatch,Semaphore,CyclicBarrier,Future)

CyclicBarrier CyclicBarrier是用来一个关卡来阻挡住所有线程,等所有线程全部执行到关卡处时,再统一执行下一步操作.假设一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家就等待 . 代码示例: public class UseCyclicBarrier { static class Runner implements Runnable { private CyclicBarrier barrier; private Strin

Jakob Jenkov 写的 java.util.concurrent API 指南

1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类.在这个包被添加以前,你需要自己去动手实现自己的相关工具类.本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们.本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异.

Java 并发工具包 java.util.concurrent 大全

1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类.在这个包被添加以前,你需要自己去动手实现自己的相关工具类. 本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们.本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异

Java_并发工具包 java.util.concurrent 用户指南(转)

译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf[带书签] 进行下载. 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台

谈论高并发(三十)解析java.util.concurrent各种组件(十二) 认识CyclicBarrier栅栏

这次谈话CyclicBarrier栅栏,如可以从它的名字可以看出,它是可重复使用. 它的功能和CountDownLatch类别似,也让一组线程等待,然后开始往下跑起来.但也有在两者之间有一些差别 1. 不同的对象等.CountDownLatch组线程等待的是一个事件.或者说是一个计数器归0的事件.而CyclicBarrier等待的对象是线程,仅仅有线程都到齐了才往下运行 2. 使用方式不同,这个也是由等待的对象不同引起的,CountDownLatch须要调用await()来让线程等待.调用cou

聊聊高并发(三十)解析java.util.concurrent各个组件(十二) 理解CyclicBarrier栅栏

这篇讲讲CyclicBarrier栅栏,从它的名字可以看出,它是可循环使用的.它的功能和CountDownLatch类似,也是让一组线程等待,然后一起开始往下执行.但是两者还是有几个区别 1. 等待的对象不同.CountDownLatch的一组线程等待的是一个事件,或者说是一个计数器归0的事件.而CyclicBarrier等待的对象是线程,只有线程都到齐了才往下执行 2. 使用方式不同,这个也是由等待的对象不同引起的,CountDownLatch需要调用await()来让线程等待,调用count

[转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier

转载自http://janeky.iteye.com/blog/769965 Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效.易维护.结构清晰的Java多线程程序.从这篇blog起,我将跟大家一起共同学习这些新的Java多线程构件 1. CountDownLatch     我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个