• Java核心知识点学习----线程同步工具类,CyclicBarrier学习


    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发.

    1.效果如下:

     

    2.实现代码:

    package com.amos.concurrent;
    
    import java.util.Random;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /** 
    * @ClassName: CyclicBarrierTest 
    * @Description: 线程同步工具类,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发,日常应用中较少涉及
    * @author: amosli
    * @email:hi_amos@outlook.com
    * @date Apr 25, 2014 1:35:34 AM  
    */
    public class CyclicBarrierTest {
        public static void main(String[] args) {
            final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
            ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
            for(int i=0;i<3;i++){
                Runnable runnable = new Runnable() {
                    public void run() {
                        try {
                            Thread.sleep(new Random().nextInt(1000));
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }
                        System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点1"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人"));
                        try {
                            cyclicBarrier.await();
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        } 
                        
                        try {
                            Thread.sleep(new Random().nextInt(1000));
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }
                        System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点2"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人"));
                        try {
                            cyclicBarrier.await();
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        } 
                        
                    }
                };
                newCachedThreadPool.execute(runnable);
            }
            newCachedThreadPool.shutdown();
        }
    }

    3.用法:

    1),如何创建?

    CyclicBarrier cyclicBarrier = new CyclicBarrier((int parties);
    CyclicBarrier cyclicBarrier =new CyclicBarrier(int parties, Runnable barrierAction)

    2).如何控制线程到一个集结点?

    cyclicBarrier.await();

    调用await()方法即可.

    同时可以设置最长待时间,只需要调用await(long timeout, TimeUnit unit)方法即可.

    3)如何打破障碍?

    breakBarrier(); 

    调用breakBarrier() 方法将可以打破当前的障碍.

    如果看其内部实现方法不难发现关于Lock锁的应用.

  • 相关阅读:
    Struts2声明式异常处理
    几种常用的过滤器
    Jdk 和 Tomcat的 安装。(旧版本,请看新版本3篇)
    java 判断字符串是否相等
    PreparedStatement 查询 In 语句 setArray 等介绍。
    String、StringBuffer与StringBuilder之间区别
    IntelliJ IDEA 里 查看一个函数注释的方法是 ctrl+q
    Java字符串拼接效率对比
    Java 中判断字符串是否为空
    IntelliJ IDEA + Tomcat ;On Upate Action 与 On Frame Deactivation
  • 原文地址:https://www.cnblogs.com/amosli/p/3687788.html
Copyright © 2020-2023  润新知