1package com.my.demo; 2import java.util.concurrent.CountDownLatch; 3import java.util.concurrent.ExecutorService; 4import java.util.concurrent.Executors; 5 6/** 7 * 用CountDownLatch来模拟运动员赛跑的Demmo. 8 */ 9public class CountDownLatchDemo { 10 /** 参与比赛的人数(并发线程数) */ 11 private static int PLAYER_NUM = 8; 12 13 public static void main(String[] args) throws Exception { 14 //用于让主线程(裁判)等待所有子线程(运动员)就绪 15 final CountDownLatch readySignal = new CountDownLatch(PLAYER_NUM); 16 //用于让子线程(运动员)等待主线程(裁判)发号施令 17 final CountDownLatch beginSignal = new CountDownLatch(1); 18 //用于让主线程(裁判)等待所有子线程(运动员)执行(比赛)完成 19 final CountDownLatch endSignal = new CountDownLatch(PLAYER_NUM); 20 ExecutorService executorService = Executors.newFixedThreadPool(PLAYER_NUM); 21 22 for(int i = 0; i < PLAYER_NUM; i++){ 23 final int num = i + 1; 24 Runnable player = new Runnable(){ 25 @Override 26 public void run() { 27 System.out.println("No." + num + " is ready"); 28 //一个任务就绪后,减少readySignal上的等待 29 readySignal.countDown(); 30 try { 31 //等待主线程比赛开始的命令 32 beginSignal.await(); 33 System.out.println("No." + num + " is running"); 34 Thread.sleep((long) (Math.random() * 5000)); 35 System.out.println("No.-----" + num + " arrived"); 36 } catch (InterruptedException e) { 37 e.printStackTrace(); 38 } finally { 39 //每个线程执行完成后,调用countDown减少在endSignal上的等待线程数 40 endSignal.countDown(); 41 } 42 } 43 }; 44 executorService.execute(player); 45 } 46 47 //这里让主线程等待,确保所有子线程已开始执行并调用了await进入等待状态 48 readySignal.await(); 49 System.out.println("Game Start!"); 50 //所有等待在beginSignal上的线程(运动员)开始执行(比赛) 51 beginSignal.countDown(); 52 try { 53 //等待所有在endSignal上的线程(运动员)执行(比赛)完成 54 endSignal.await(); 55 } catch (InterruptedException e) { 56 e.printStackTrace(); 57 } finally { 58 System.out.println("Game Over!"); 59 executorService.shutdown(); 60 } 61 } 62}
CounDownLatchDemo
Stella981
2021-10-11
1037 0 0
点赞
收藏
评论区
加载中...