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. }  
原文地址:https://www.cnblogs.com/wnlja/p/4377962.html