• 【Coucurrency-CountDownLatch】-20161203-0002


    简介

    java异步任务相关的工具。主要用在某些线程需要等到其他线程完成某些操作后才能执行的场景。

    等待线程需要显示的调用wait方法,表示线程当前挂起,需要等到countdownLatch到0才执行。另一些线程调用countDown对countDownLatch - 1,达到0时则调用wait方法的线程得到执行。

    小故事

    小明去吃铁板烧快餐,来到窗口后他发现都是旧菜但是他希望吃刚煮好的。经过交谈后师傅承诺之前的菜卖完就给他煮新的,这个时候小明就占据了这个窗口,其他窗口则继续卖菜。终于旧菜卖完了小明也拿到了新的菜,愉快的吃起了饭。
    这里窗口就是线程数,小明所在窗口需要其他窗口把旧菜卖完才能有新的菜,小明所在的线程是挂起的,其他窗口每卖一份就对这个菜减一。菜的量就是CountDownLatch。

    DEMO

    package calvin;
    
    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    
    public class TestCountDownLatch {
    	public static void main(String[] args){
    		CountDownLatch latch = new CountDownLatch(2);
    		Window win = null;
    		for(int i =0; i< 4; i ++){
    			win = new Window(latch);
    			new Thread(win).start();
    		}
    		System.out.println("wait");
    		try {
    			latch.await();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println("down");
    	}
    	
    	public static class Window implements Runnable{
    		private CountDownLatch latch = null;
    		public Window(CountDownLatch latch){
    			this.latch = latch;
    		}
    		
    		@Override
    		public void run(){
    			int time = new Random().nextInt(5) * 1000;
    			try {
    				Thread.sleep(time);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			System.out.println("thread = " + Thread.currentThread().getName());
    			latch.countDown();
    		}
    	}
    }
    // 运行结果:
    wait
    thread = Thread-1
    thread = Thread-0
    down
    thread = Thread-3
    thread = Thread-2
    
    

    小结

    CountDonwLatch可以用作一个计数器。主要用在某个线程需要等待某个事件发生后才能被执行的地方。

  • 相关阅读:
    AJAX异步交互
    Java 异常讲解(转)
    Spring 配置文件详解 (以2.5为例)
    Java 获取当前系统时间方法比较
    Cannot change version of project facet Dynamic web module to 3.0
    使用 GCC 调试程序
    汇编 内存段划分和寄存器
    java.lang.StringBuilder
    java.lang.String
    建立和断开与MySQL服务器的连接
  • 原文地址:https://www.cnblogs.com/calvin-207/p/6130317.html
Copyright © 2020-2023  润新知