JavaSE--CountDownLatch & CyclicBarrier

匿名 (未验证) 提交于 2019-12-02 21:53:52

参考:http://www.importnew.com/21889.html

CountDownLatch

  countDown() 方法执行完只是计数器减一, 并不会阻塞当前运行线程的的后续代码执行.

 

 

 1 package org.wzh.demo.demo1;  2   3 import java.util.Random;  4 import java.util.concurrent.CountDownLatch;  5   6 public class D4CountDownLatch {  7   8     class Task extends Thread {  9  10         private CountDownLatch latch; 11  12         public Task(CountDownLatch latch) { 13             super(); 14             this.latch = latch; 15         } 16  17         @Override 18         public void run() { 19             // TODO Auto-generated method stub 20             try { 21                 int time = (new Random().nextInt(8000) + 10000) / 1000; 22                 System.out.println(Thread.currentThread().getName() + " 预计成绩 " + time + " seconds"); 23                 Thread.sleep(time * 1000); 24                 latch.countDown();//*** 25                 System.out.println(Thread.currentThread().getName() + " 到达终点!"); 26                 synchronized (latch) { 27                     System.out.println("~~~~~~~~"); 28                     System.out.println(Thread.currentThread().getName()); 29                     System.out.println("~~~~~~~~"); 30                 } 31             } catch (InterruptedException e) { 32                 // TODO Auto-generated catch block 33                 e.printStackTrace(); 34             } 35              36         } 37  38     } 39  40     public static void main(String[] args) throws InterruptedException { 41         CountDownLatch latch = new CountDownLatch(3);//*** 42  43         System.out.println("百米赛跑比赛开始"); 44  45         System.out.println("参赛选手:"); 46         String[] names = {"小明", "小强", "小智"}; 47         for (String name : names) { 48             System.out.println("\t" + name); 49         } 50          51         for (int i = 0; i < 3; i++) { 52             Thread t = new D4CountDownLatch().new Task(latch); 53             t.setName(names[i]); 54             t.start(); 55         } 56         latch.await();//*** 57         Thread.sleep(500); 58         System.out.println("百米赛跑比赛结束"); 59     } 60  61 }
百米赛跑比赛开始 参赛选手:     小明     小强     小智 小智 预计成绩 10 seconds 小明 预计成绩 14 seconds 小强 预计成绩 14 seconds 小智 到达终点! ~~~~~~~~ 小智 ~~~~~~~~ 小强 到达终点! ~~~~~~~~ 小强 小明 到达终点! ~~~~~~~~ ~~~~~~~~ 小明 ~~~~~~~~ 百米赛跑比赛结束

 

 

CyclicBarrier

  await() 方法阻塞后面的代码,直到达到条件才继续向下执行.  

 

 1 package org.wzh.demo.demo1;  2   3 import java.util.Random;  4 import java.util.concurrent.BrokenBarrierException;  5 import java.util.concurrent.CyclicBarrier;  6   7   8 public class D4CyclicBarrier {  9      10     class Task extends Thread { 11  12         private CyclicBarrier barrier; 13  14         public Task(CyclicBarrier barrier) { 15             super(); 16             this.barrier = barrier; 17         } 18  19         @Override 20         public void run() { 21             // TODO Auto-generated method stub 22             try { 23                 int time = (new Random().nextInt(8000) + 10000) / 1000; 24                 System.out.println(Thread.currentThread().getName() + " 预计成绩 " + time + " seconds"); 25                 Thread.sleep(time * 1000); 26                 System.out.println(Thread.currentThread().getName() + " 到达终点!"); 27                 barrier.await();//*** 28                 synchronized (barrier) { 29                     System.out.println("~~~~~~~~"); 30                     System.out.println(Thread.currentThread().getName()); 31                     System.out.println("~~~~~~~~"); 32                 } 33             } catch (InterruptedException e) { 34                 // TODO Auto-generated catch block 35                 e.printStackTrace(); 36             } catch (BrokenBarrierException e) { 37                 // TODO Auto-generated catch block 38                 e.printStackTrace(); 39             } 40         } 41  42     } 43      44     public static void main(String[] args) { 45         try { 46             CyclicBarrier barrier = new CyclicBarrier(4);//*** 47  48             System.out.println("百米赛跑比赛开始"); 49             String[] names = {"小明", "小强", "小智"}; 50             System.out.println("参赛选手:"); 51             for (String name : names) { 52                 System.out.println("\t" + name); 53             } 54             for (int i = 0; i < 3; i++) { 55                 Thread t = new D4CyclicBarrier().new Task(barrier); 56                 t.setName(names[i]); 57                 t.start(); 58             } 59             barrier.await(); 60             Thread.sleep(500); 61             System.out.println("百米赛跑比赛结束"); 62         } catch (Exception e) { 63             e.printStackTrace(); 64         } 65     } 66  67 }
百米赛跑比赛开始 参赛选手:     小明     小强     小智 小明 预计成绩 12 seconds 小强 预计成绩 14 seconds 小智 预计成绩 10 seconds 小智 到达终点! 小明 到达终点! 小强 到达终点! ~~~~~~~~ 小智 ~~~~~~~~ ~~~~~~~~ 小明 ~~~~~~~~ ~~~~~~~~ Сǿ ~~~~~~~~ 百米赛跑比赛结束

 

 

区别

  CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

    CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

    而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

  另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。

JavaSE--CountDownLatch & CyclicBarrier

原文:https://www.cnblogs.com/microcat/p/9214254.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!