博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java CyclicBarrier介绍
阅读量:5888 次
发布时间:2019-06-19

本文共 2133 字,大约阅读时间需要 7 分钟。

hot3.png

CyclicBarrier (周期障碍)类可以帮助同步,它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier 是使用整型变量构造的,其确定组中的线程数。当一个线程到达屏障时(通过调用 CyclicBarrier.await()),它会被阻塞,直到所有线程都到达屏障,然后在该点允许所有线程继续执行。与CountDownLatch不同的是,CyclicBarrier 所有公共线程都到达后,可以继续执行下一个目标点,而CountDownLatch第一次到达指定点后,也就是记数器减制零,就无法再次执行下一目标工作。下面主要演义CyclicBarrier 的用法:

package com.test;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.concurrent.BrokenBarrierException;

import java.util.concurrent.CyclicBarrier;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class TestCyclicBarrier {

private static int[] timeWalk = { 5, 8, 15, 15, 10 };  // 徒步需要的时间

private static int[] timeSelf = { 1, 3, 4, 4, 5 };           // 自驾游

private static int[] timeBus = { 2, 4, 6, 6, 7 };           // 旅游大巴

static String now() {

            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

            return sdf.format(new Date()) + ": ";

}

static class Tour implements Runnable {

            private   int[]     times;

            private   CyclicBarrier    barrier;

            private   String   tourName;

public Tour(CyclicBarrier barrier, String tourName, int[] times) {

            this.times = times;

            this.tourName = tourName;

            this.barrier = barrier;

}

public void run() {

        try {

                 Thread.sleep(times[0] * 1000);

                  System.out.println(now() + tourName + " 合肥");

                  barrier.await();

                  Thread.sleep(times[1] * 1000);

                  System.out.println(now() + tourName + " 南京");

                   barrier.await();

                  Thread.sleep(times[4] * 1000);

                   System.out.println(now() + tourName + " 上海");

                   barrier.await();

                   System.out.println(tourName + "飞机 合肥");

         } catch (InterruptedException e) {

                   e.printStackTrace();

          } catch (BrokenBarrierException e) {

                    e.printStackTrace();

          }

    }

}

 

public static void main(String[] args) {

              CyclicBarrier barrier = new CyclicBarrier(3);

               ExecutorService exec = Executors.newFixedThreadPool(3);

               exec.submit(new Tour(barrier, "徒步", timeWalk));

               exec.submit(new Tour(barrier, "自驾", timeSelf));

               exec.submit(new Tour(barrier, "大巴", timeBus));

              exec.shutdown();

  }

}

最后执行结果如下:

16:24:35: 自驾 合肥

16:24:36: 大巴 合肥

16:24:39: 徒步 合肥

16:24:42: 自驾 南京

16:24:43: 大巴 南京

16:24:47: 徒步 南京

16:24:52: 自驾 上海

16:24:54: 大巴 上海

16:24:57: 徒步 上海

徒步飞机 合肥

自驾飞机 合肥

大巴飞机 合肥

转载于:https://my.oschina.net/redhouse/blog/60739

你可能感兴趣的文章
转自CSDN:写给25岁以上单身男性的100条忠告
查看>>
经纬度坐标系与UTM MGRS坐标系之间的转换 c# 版本
查看>>
二度社区免费论坛v1.0正式提供下载
查看>>
MSC/VLR/SSP
查看>>
如何连接oracle数据库及故障解决办法
查看>>
工作流 - 技术备忘录
查看>>
void及void指针类型
查看>>
Linux下Socket编程的端口问题( Bind error: Address already in use )
查看>>
C#泛型编程
查看>>
matlab练习程序(纹理合成)
查看>>
关于Silverlight_Tools.exe安装不上的问题
查看>>
Asp.net 实现GridView分页时记录CheckBox状态
查看>>
关于事务
查看>>
实现用户注册验证码
查看>>
WM有约II(九):再谈部署
查看>>
Delegate,Action,Func,匿名方法,匿名委托,事件
查看>>
shellcode初步成就
查看>>
android AudioRecorder简单心得
查看>>
判断一个数是否为2的次方幂
查看>>
SQL Server:孤立用户详解
查看>>