天天看点

【Java CountDownLatch】用法举例子

CountDownLatch

百度翻译:倒计时锁存器

大致意思就是要等到,所有的线程都执行完毕后,再往下执行。

举个例子:

司机给游客说,你们同时去游览故宫吧,11点到车这集合,我等到人齐了才发车。

在多线程的环境中,主进程是不等待线程执行完毕,就继续往下执行的,例子的意思就是说,当司机说完这句话,

游客都走了之后,这个司机就开车走了。。。这个结果很严重,编程是抽象,那么现实中这个例子如何解决。

那好,司机在说话的时候,每个人走的时候发一个号码,1到100 ,共100个人。那么回来一个我计数器加1,

回来一个计数器加1 ,当最后的计数器等于我发放的号码的数量的时候,我才开车走。

package com.wyl.cn.CountDownLatch;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {
	 //构造线程池
  	private static ThreadPoolExecutor executor = new ThreadPoolExecutor(5,5,
  			100000, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(20000));
  
	public static void main(String[] args) {
		 //这里的10的意思就是  当初发的号码的 总数 是10个
		CountDownLatch countDown = new CountDownLatch(10);
		for(int i=0;i<10;i++){
			Transfer sfer=new Transfer("将天使"+i,countDown);
			
			executor.execute(sfer);
		}
		
		try {
		// 等待状态,回来的号码数 小于我发出去的号码总数,等着吧,人还不齐
			countDown.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 等待状态,回来的号码数 等于我发出去的号码总数,ok,可以开车走了。。哈哈 好玩吧
		System.out.println("I am  end!!!!");
		
	}

}

           
package com.wyl.cn.CountDownLatch;

import java.util.concurrent.CountDownLatch;

public class Transfer implements Runnable {
	
	private String name;
	
	private CountDownLatch countDown=null;
	
	public Transfer(String name,CountDownLatch countDown){
		this.name=name;
		this.countDown=countDown;
	}
	
	public int mm=0;

	public void run() {
		
		mm++;
		
		
		
		try {
			Thread.sleep(5000);
			System.out.println(name+"===========>"+mm);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		countDown.countDown();

	}

}

           

有意思,编程来源于生活,高于生活,好玩好玩

继续阅读