JAVA多线程CyclicBarrier应用

来源:互联网 发布:电大与网络教育双学籍 编辑:程序博客网 时间:2024/06/07 20:48

 

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

 

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

 

  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.     }