CyclicBarrier类的应用范例

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

 

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

 

范例源码:

Java代码   收藏代码
  1. package com.jeyo.java5;  
  2.   
  3. import java.util.concurrent.BrokenBarrierException;  
  4. import java.util.concurrent.CyclicBarrier;  
  5.   
  6. public class Test3 {  
  7.     //一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)  
  8.     final CyclicBarrier barrier;  
  9.       
  10.     //线程数  
  11.     int count;  
  12.       
  13.     class Worker implements Runnable{  
  14.         int index;  
  15.         Worker(int index){  
  16.             this.index = index;  
  17.         }  
  18.         public void run() {  
  19.             System.out.println("第" + index + "个线程休眠"+(2 * index)+"秒!");  
  20.             try {  
  21.                 Thread.sleep(2000 * index);  
  22.             } catch (InterruptedException e) {  
  23.                 e.printStackTrace();  
  24.             }  
  25.             System.out.println("第" + index + "个线程结束休眠!");  
  26.               
  27.             try {  
  28.                 //等待其它线程都处理完毕后,再继续以下代码的执行  
  29.                 barrier.await();  
  30.             } catch (InterruptedException e) {  
  31.                 e.printStackTrace();  
  32.             } catch (BrokenBarrierException e) {  
  33.                 e.printStackTrace();  
  34.             }  
  35.               
  36.             System.out.println(index);  
  37.         }  
  38.     }  
  39.       
  40.     public Test3(int count){  
  41.         this.count = count;  
  42.           
  43.         //公共屏障点 等待到5个线程后,执行相应的barrierAction  
  44.         barrier = new CyclicBarrier(count, new Runnable() {  
  45.             public void run(){  
  46.                 System.out.println("全部线程已执行完毕!");  
  47.             }  
  48.         });  
  49.           
  50.         for(int i=1;i<=this.count;i++){  
  51.             new Thread(new Worker(i)).start();  
  52.         }  
  53.     }  
  54.       
  55.     public static void main(String[] args) {  
  56.         new Test3(5);  
  57.     }  
  58. }  

 

 

CyclicBarrier类的应用范例

你可能感兴趣的:(Cyclicbarrier)