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

简介:   import java.util.Random; import java.util.concurrent.CyclicBarrier;   /**  * CyclicBarrier维持一个计数器,与CountDownLatch不同的是,等待这个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();

       }

}

 

 

 

 

 

目录
相关文章
|
2月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
7月前
|
存储 监控 数据可视化
JDK21最终版协程实现之虚拟线程(上)
JDK21最终版协程实现之虚拟线程
161 3
|
7月前
|
安全 Java 测试技术
JDK21最终版协程实现之虚拟线程(下)
JDK21最终版协程实现之虚拟线程
492 3
|
9月前
|
Java 调度
《JavaSE-第二十一章》之线程的状态与中断
《JavaSE-第二十一章》之线程的状态与中断
|
设计模式 监控 安全
Java多线程(完整版)、基本概念:程序、进程、线程、线程的创建和使用、线程的生命周期、线程的同步、线程的通信、JDK5.0新增线程创建方式、wait(),notify(),notifyAll()
Java多线程(完整版)、基本概念:程序、进程、线程、线程的创建和使用、线程的生命周期、线程的同步、线程的通信、JDK5.0新增线程创建方式、wait(),notify(),notifyAll()
Java多线程(完整版)、基本概念:程序、进程、线程、线程的创建和使用、线程的生命周期、线程的同步、线程的通信、JDK5.0新增线程创建方式、wait(),notify(),notifyAll()
|
算法 Java Linux
JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理
JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理
|
Java Maven
java 多线程分段等待执行完成状况,循环屏障CyclicBarrier | Java工具类
java 多线程分段等待执行完成状况,循环屏障CyclicBarrier | Java工具类
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
|
监控 Java Unix
Java并发 --- 线程创建、状态与方法等
Java并发 --- 线程创建、状态与方法等
Java并发 --- 线程创建、状态与方法等
|
Java
Java之同步计数器CyclicBarrier
看下图,体会一下处理流程上的不同。
1377 0