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锁的应用.

  • 相关阅读:
    整理公共基础库子系统和系统属性组件
    鸿蒙轻内核M核源码分析系列六 任务及任务调度(1)任务栈
    HarmonyOS三方件开发指南(19)-BGABadgeView徽章组件
    鸿蒙的DFX子系统
    安卓to鸿蒙系列:ButterKnife(一)
    基于Neptune开发板的键盘蓝牙模块DIY指南
    徒手撸一个Spring Boot中的starter
    这三道最基础的java面试题,你真的答得上来吗?
    奇葩java迭代器面试题,还真有很多人踩坑
    15道类和对象面试题,快看看自己会几道
  • 原文地址:https://www.cnblogs.com/amosli/p/3687788.html
Copyright © 2011-2022 走看看