CounDownLatchDemo

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}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Android So动态加载 优雅实现与原理分析

背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我