zoukankan      html  css  js  c++  java
  • CountDownLatch用法

    /**
     * CountDownLatch的两种使用场景:
     * 场景1:让多个线程等待
     * 场景2:和让单个线程等待。
     */
    public class CountDownLatchDemo {
    
    	public static void main(String[] args) throws Exception{
    		changjing1();
    //		changjing2();
    	}
    	
    	//场景1:让多个线程等待
    	/**
    	 * >(1)在这个场景中,CountDownLatch充当的是一个发令枪的角色;
    	 * 就像田径赛跑时,运动员会在起跑线做准备动作,等到发令枪一声响,运动员就会奋力奔跑。
    	 * 
    	 * >(2)我们通过CountDownLatch.await(),让多个参与者线程启动后阻塞等待,
    	 * 然后在主线程 调用CountDownLatch.countdown(1) 将计数减为0,
    	 * 让所有线程一起往下执行;以此实现了多个线程在同一时刻并发执行,来模拟并发请求的目的。
    	 */
    	public static void changjing1() throws Exception{
    		CountDownLatch countDownLatch = new CountDownLatch(1);
    		for (int i = 0; i < 5; i++) {
    			final int index = i;
    			new Thread(()->{
    				try {
    					countDownLatch.await();
    					System.out.println(Thread.currentThread().getName() + "	运动员" + index + "号	开始跑了");
    				} catch (InterruptedException e) {
    					
    				}
    			},"线程" + i).start();
    		}
    		Thread.sleep(1000);
    		countDownLatch.countDown();
    	}
    	//场景2:和让单个线程等待。
    	//5个人都下班,才算真正的下班
    	public static void changjing2() throws Exception{
    		CountDownLatch countDownLatch = new CountDownLatch(10);
    		for (int i = 0; i < 10; i++) {
    			final int index = i;
    			new Thread(()->{
    				System.out.println(Thread.currentThread().getName() + " --> 员工" + index + "号	收拾东西下班");
    				countDownLatch.countDown();
    			},"线程" + i).start();
    		}
    		countDownLatch.await();
    		System.out.println("所有人都走了,可以下班了,嘿嘿^_^");
    	}
    }
    
    • 场景1输出结果:(1s过后同时开始执行)
    线程0	运动员0号	开始跑了
    线程4	运动员4号	开始跑了
    线程1	运动员1号	开始跑了
    线程2	运动员2号	开始跑了
    线程3	运动员3号	开始跑了
    
    • 场景2输出结果:(count为0时,放行await后的代码)
    线程0 --> 员工0号	收拾东西下班
    线程5 --> 员工5号	收拾东西下班
    线程1 --> 员工1号	收拾东西下班
    线程2 --> 员工2号	收拾东西下班
    线程3 --> 员工3号	收拾东西下班
    线程8 --> 员工8号	收拾东西下班
    线程4 --> 员工4号	收拾东西下班
    线程9 --> 员工9号	收拾东西下班
    线程7 --> 员工7号	收拾东西下班
    线程6 --> 员工6号	收拾东西下班
    所有人都走了,可以下班了,嘿嘿^_^
    

    参考博客:
    https://zhuanlan.zhihu.com/p/148231820

  • 相关阅读:
    拆点问题
    黑球白球
    3n+1b 备忘录方法
    实体entity、JavaBean、Model、POJO、domain的区别
    DB中的读写分离
    Jmeter干货 不常用却极其有用的几个地方
    自动化测试 自动化框架需要满足的事项
    自动化测试面试题库
    测试工程师面试准备之----测试基础
    别人的面试经历 软件测试工程师
  • 原文地址:https://www.cnblogs.com/kaka-qiqi/p/14915885.html
Copyright © 2011-2022 走看看