Java并发包5--同步工具CountDownLatch、CyclicBarrier、Semaphore的实现原理解析

JUC中提供了很多同步工具类,比如CountDownLatch、CyclicBarrier、Semaphore等,都可以作用同步手段来实现多线程之间的同步效果

一、CountDownLatch 1.1、CountDownLatch的使用

CountDownLatch可以理解为是同步计数器,作用是允许一个或多个线程等待其他线程执行完成之后才继续执行,比如打dota、LoL或者王者荣耀时,创建了一个五人房,只有当五个玩家都准备了之后,游戏才能正式开始,否则游戏主线程会一直等待着直到玩家全部准备。在玩家没准备之前,游戏主线程会一直处于等待状态。如果把CountDownLatch比做此场景都话,相当于开始定义了匹配游戏需要5个线程,只有当5个线程都准备完成了之后,主线程才会开始进行匹配操作。

CountDownLatch案例如下:

1 public static void countDownLatchTest() throws Exception{ 2 CountDownLatch latch = new CountDownLatch(5);//定义了需要达到条件都线程为5个线程 3 new Thread(new Runnable() { 4 @Override 5 public void run() { 6 for (int i=0; i<12; i++){ 7 try { 8 Thread.sleep(1000L); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 new Thread(new Runnable() { 13 @Override 14 public void run() { 15 long count = latch.getCount(); 16 latch.countDown();/**相当于准备游戏成功*/ 17 if(count > 0) { 18 System.out.println("线程" + Thread.currentThread().getName() + "组队准备,还需等待" + latch.getCount() + "人准备"); 19 }else { 20 System.out.println("线程" + Thread.currentThread().getName() + "组队准备,房间已满不可加入"); 21 } 22 } 23 }).start(); 24 } 25 } 26 }).start(); 27 new Thread(new Runnable() { 28 @Override 29 public void run() { 30 try { 31 System.out.println("游戏房间等待玩家加入..."); 32 /**一直等待到规定数量到线程都完全准备之后才会继续往下执行*/ 33 latch.await(); 34 System.out.println("游戏房间已锁定..."); 35 } catch (InterruptedException e) { 36 e.printStackTrace(); 37 } 38 } 39 }).start(); 40 System.out.println("等待玩家准备中..."); 41 /**一直等待到规定数量到线程都完全准备之后才会继续往下执行*/ 42 latch.await(); 43 System.out.println("游戏匹配中..."); 44 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszgs.html