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();
}
}
有意思,编程来源于生活,高于生活,好玩好玩