• JDK5.0新特性系列11.5.3线程 同步装置之CyclicBarrier


    import java.util.Random;

    import java.util.concurrent.CyclicBarrier;

     

    /**

     * CyclicBarrier维持一个计数器,CountDownLatch不同的是,等待这个CyclicBarrier的线程必须等到计数器的某个值时,才可以继续.

     * CyclicBarrier就像它名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍.

     */

    /**

     * 本实例实现一个数组相邻元素的加法,一个线程给数组的第一个元素赋值,然后等待其它线程给数组第二个元素赋值,然后将第一个元素和第二个元素相加.

     */

    /**

     * CyclicBarrier的关键技术点如下:

     * 1.构造CyclicBarrier对象时,需要指定计数器的目标值,计数器的初始值为0.

     * 还可以在构造方法中带一个 Runnable参数,表示当计数器到达目标值是,在等待CyclicBarrier的线程被唤醒之前,指定该Runnable任务.

     * 2.CyclicBarrierawait方法使当前线程进入等待状态,同时将计数器值加1,当计数器到达目标值时,当前线程被唤醒.

     */

    public class CyclicBarrierTest {

           public static class ComponentThread implements Runnable{

                  CyclicBarrier barrier;//计数器

                  int ID;//组件

                  int[] array//数据数组

                  public ComponentThread(CyclicBarrier barrier,int[] array,int ID){

                         this.barrier = barrier;

                         this.ID = ID;

                         this.array = array;

                  }

                  public void run(){

                         try{

                                //RandomnextInt(int n)方法返回一个[0,n)范围内的随机数

                                array[ID] = new Random().nextInt(100);

                                System.out.println("Componet " + ID + " sleep...");

                                barrier.await();

                                System.out.println("Componet " + ID + " awaked...");

                                //计算数据数组中的当前值和后续值

                                int result = array[ID] + array[ID + 1];

                                System.out.println("Component " + ID + " result: " + result);

                         }catch(Exception ex){

                         }

                  }

           }

           /**测试CyclicBarrier的用法*/

           public static void testCyclicBarrier(){

                  final int[] array = new int[3];

                  CyclicBarrier barrier = new CyclicBarrier(2,new Runnable(){

                         public void run(){

                                System.out.println("testCyclicBarrier run...");

                                array[2] = array[0] + array[1];

                         }

                  });

                  //启动线程

                  new Thread(new ComponentThread(barrier,array,0)).start();

                  new Thread(new ComponentThread(barrier,array,1)).start();

           }

           public static void main(String... args){

                  CyclicBarrierTest.testCyclicBarrier();

           }

    }

  • 相关阅读:
    【转载】在Linux中使用VS Code编译调试C++项目
    【转载】Visual Studio 2015 for Linux更好地支持Linux下的开发
    【转载】ODBC, OLEDB, ADO, ADO.Net的演化简史
    【转载】OLE DB, ADO, ODBC关系与区别
    【转载】ADO,OLEDB,ODBC,DAO的区别
    【转载】Linux系统启动流程
    91. Decode Ways
    90. Subsets II
    89. Gray Code
    88. Merge Sorted Array
  • 原文地址:https://www.cnblogs.com/taven/p/2291476.html
Copyright © 2020-2023  润新知