天天看點

【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();

	}

}

           

有意思,程式設計來源于生活,高于生活,好玩好玩

繼續閱讀