zoukankan      html  css  js  c++  java
  • CountDownLatch和CyclicBarrier 的用法

    CountDownLatch是减计数方式,计数==0时释放所有等待的线程;CyclicBarrier是加计数方式,计数达到构造方法中参数指定的值时释放所有等待的线程。
    CountDownLatch当计数到0时,计数无法被重置;CyclicBarrier计数达到指定值时,计数置为0重新开始。
    CountDownLatch每次调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响;CyclicBarrier只有一个await()方法,调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞。

    1. import java.util.concurrent.CountDownLatch;  
    2.   
    3. public class TestConcurrent extends Thread {  
    4.     /** 
    5.      * CountDownLatch 是并发包中提供的一个可用于控制多个线程同时开始某个动作的类,其 
    6.      * 采用的方式为减计数的方式,当计数减至零时位于latch.await()后的代码才会被执行。 
    7.      */  
    8.     private static CountDownLatch latch = new CountDownLatch(10);  
    9.   
    10.     public static void main(String[] args) {  
    11.         long start = System.currentTimeMillis();  
    12.         int i = 0;  
    13.         while (i < 10) {  
    14.             i++;  
    15.             new TestConcurrent().start();  
    16.         }  
    17.         try {  
    18.             latch.await();  
    19.         } catch (InterruptedException e) {  
    20.             e.printStackTrace();  
    21.         }  
    22.         System.out.println("use time:" + (System.currentTimeMillis() - start));  
    23.     }  
    24.   
    25.     public void run() {  
    26.         System.out.println("...");  
    27.         try {  
    28.             Thread.sleep(100);  
    29.         } catch (InterruptedException e) {  
    30.             e.printStackTrace();  
    31.         }  
    32.         latch.countDown();  
    33.     }  
    34. }  
    import java.util.concurrent.CountDownLatch;
    
    public class TestConcurrent extends Thread {
    	/**
    	 * CountDownLatch 是并发包中提供的一个可用于控制多个线程同时开始某个动作的类,其
    	 * 采用的方式为减计数的方式,当计数减至零时位于latch.await()后的代码才会被执行。
    	 */
    	private static CountDownLatch latch = new CountDownLatch(10);
    
    	public static void main(String[] args) {
    		long start = System.currentTimeMillis();
    		int i = 0;
    		while (i < 10) {
    			i++;
    			new TestConcurrent().start();
    		}
    		try {
    			latch.await();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println("use time:" + (System.currentTimeMillis() - start));
    	}
    
    	public void run() {
    		System.out.println("...");
    		try {
    			Thread.sleep(100);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		latch.countDown();
    	}
    }
    


     

      1. import java.util.concurrent.BrokenBarrierException;  
      2. import java.util.concurrent.CyclicBarrier;  
      3. import java.util.concurrent.TimeUnit;  
      4. import java.util.concurrent.TimeoutException;  
      5.   
      6. public class TestCyclicBarrier extends Thread {  
      7.     /** 
      8.      * CyclicBarrier 和CountDownLatch不同,CyclicBarrier是当await 的数量达到了设置的数量后, 
      9.      * 才继续往下执行 
      10.      */  
      11.     static CyclicBarrier cyclicBarrier = new CyclicBarrier(10);  
      12.     private int id;  
      13.   
      14.     public TestCyclicBarrier(int id) {  
      15.         this.id = id;  
      16.     }  
      17.   
      18.     public static void main(String[] args) {  
      19.         long start = System.currentTimeMillis();  
      20.         int i = 0;  
      21.         while (i < 10) {  
      22.             i++;  
      23.             new TestCyclicBarrier(i).start();  
      24.         }  
      25.         System.out.println("use time:" + (System.currentTimeMillis() - start));  
      26.     }  
      27.   
      28.     public void run() {  
      29.         try {  
      30.             System.out.println("----start:" + id);  
      31.             cyclicBarrier.await(1000, TimeUnit.MILLISECONDS);  
      32.             System.out.println("----start__:" + id);  
      33.         } catch (InterruptedException e1) {  
      34.             e1.printStackTrace();  
      35.         } catch (BrokenBarrierException e) {  
      36.             e.printStackTrace();  
      37.         } catch (TimeoutException e) {  
      38.             e.printStackTrace();  
      39.         }  
      40.         try {  
      41.             Thread.sleep(100);  
      42.         } catch (InterruptedException e) {  
      43.             e.printStackTrace();  
      44.         }  
      45.         System.out.println("----end:" + id);  
      46.     }  
      47. }  
  • 相关阅读:
    ASP.NET:关于.net中的runat
    javascript/dom:原生的JS写选项卡方法
    深入学习javascript:cookie
    javascript练习:8综合练习
    javascript/dom:对样式进行操作
    C#:form的窗体属性formborderstyle设置为none后就不能移动了
    javascript/dom:获取CSS值/getComputedStyle方法
    【玩转.Net MF – 04】远程屏幕截图
    .Net Micro Framework V4.1 beta 发布
    RFID技术在.Net Micro Framework中的应用
  • 原文地址:https://www.cnblogs.com/wnlja/p/4377962.html
Copyright © 2011-2022 走看看