zoukankan      html  css  js  c++  java
  • 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锁的应用.

  • 相关阅读:
    常用Java工具类
    Enum应用
    mybatis xml <if>判断字符串相等
    sqlserver插入图片数据
    [转载]Jquery Chosen 插件动态生成option或重新绑定
    工作问题整理-- sqlserver 新增参数限制,maven pom邮件发送
    【转载】redis.windows.conf 参数说明
    oracle11g更改字符集
    oracle基础知识小结
    [转载]SQL Server 数据库定时自动备份
  • 原文地址:https://www.cnblogs.com/amosli/p/3687788.html
Copyright © 2011-2022 走看看