zoukankan      html  css  js  c++  java
  • JAVA线程同步辅助类CyclicBarrier循环屏障

      CyclicBarrier是一个同步辅助类,主要作用是让一组线程互相等待,知道都到达一个公共障点,在一起走。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

      CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。 

    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class CyclicBarrierTest {
    
        public static void main(String[] args) {
            ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
            final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
            for (int i = 0; i < 3; i++) {
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(new Random().nextInt(10000));
                            System.out.println("线程"+Thread.currentThread().getName()+"即将到达1,当前已有"+(cyclicBarrier.getNumberWaiting()+1)+"已经到达"+(cyclicBarrier.getNumberWaiting()==2?"都到齐了,继续走":"正在等待"));
                            cyclicBarrier.await();
                            
                            Thread.sleep(new Random().nextInt(10000));
                            System.out.println("线程"+Thread.currentThread().getName()+"即将到达2, 当前已有"+(cyclicBarrier.getNumberWaiting()+1)+"已经到达"+(cyclicBarrier.getNumberWaiting()==2?"都到齐了,继续走":"正在等待"));
                            cyclicBarrier.await();
                            
                            Thread.sleep(new Random().nextInt(10000));
                            System.out.println("线程"+Thread.currentThread().getName()+"即将到达3, 当前已有"+(cyclicBarrier.getNumberWaiting()+1)+"已经到达"+(cyclicBarrier.getNumberWaiting()==2?"都到齐了,继续走":"正在等待"));
                            cyclicBarrier.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (BrokenBarrierException e) {
                            e.printStackTrace();
                        }
                    }
                };
                newCachedThreadPool.execute(runnable);
            }
            newCachedThreadPool.shutdown(); //执行完成后关闭线程池
        }
        
    }
  • 相关阅读:
    Oracle函数如何把符串装换为小写的格式
    Oralce中的synonym同义词
    JS中getYear()的兼容问题
    How to do SSH Tunneling (Port Forwarding)
    所谓深度链接(Deep linking)
    upload size of asp.net
    发一个自动刷网站PV流量的小工具
    解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示"The operation could not be completed." 的问题。
    在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录
    使用SQL语句获取Sql Server数据库的版本
  • 原文地址:https://www.cnblogs.com/duwenlei/p/5126281.html
Copyright © 2011-2022 走看看