疯狂

STANDING ON THE SHOULDERS OF GIANTS
posts - 481, comments - 486, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

CountDownLatch 简介和例子

Posted on 2011-07-04 17:14 疯狂 阅读(9308) 评论(3)  编辑  收藏 所属分类: java concurrent
    在一些应用场合中,某段程序需要等待某个条件达到要求后才能执行,或者等待一定长的时间后此行,从jdk1.5开始就可以使用CountDownLatch实现,    
  CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞后面程序执行,直到计数器为0,await(long timeout, TimeUnit unit),是等待一定时间,然后执行,不管计数器是否到0了。
下面举一个等车的例子:
10个同学上车,车等待同学上车,如果有等待时间限制,到时间就开走,不管学生上没上完。如果没有等待时间,学生上完了再开:
public class CountDownLatchTest {
    
public static int numberOfPeople = 10;//等车的学生数
    public static boolean isGone = false;//车开的标志
    public static int carWaitTime = 3;//车等的时间
    
    
public static void main(String[] args) throws InterruptedException {
        
        CountDownLatch waitStudentsGetOn 
= new CountDownLatch(numberOfPeople);
        
        
new Thread(new GetOn(waitStudentsGetOn)).start();
        
        waitStudentGetOn(waitStudentsGetOn);
//等所有的学生上车
        
        driveHome();
//开车走
        
    }

    
    
private static void waitStudentGetOn(CountDownLatch waitStudentsGetOn) throws InterruptedException {
        System.out.println(
"赶紧的,抓紧时间上车..");
        waitStudentsGetOn.await(carWaitTime, TimeUnit.SECONDS);
//等5秒,还没上车,就开走。。
        
    }


    
private static void driveHome() throws InterruptedException {
        System.out.println(
"开车,鞋儿破 帽儿破 身上的袈裟破 你笑我 他笑我 一把扇儿破");
        isGone 
= true;
        
    }

    
}

class GetOn implements Runnable{
    
    
private CountDownLatch waitStudentsGetOn;
    GetOn(CountDownLatch waitStudentsGetOn)
{
        
this.waitStudentsGetOn = waitStudentsGetOn;
    }

    
public void run() {
        
for (int i = 0; i < CountDownLatchTest.numberOfPeople; i++{
            
try {
                
if(CountDownLatchTest.isGone){
                    System.out.println(
"妈的,还差:"+waitStudentsGetOn.getCount()+" 个没娃上车呢.怎么车走了");
                    
break;
                }

                
boolean goonSuccess = new Student(i+1).getOn();//顺序上车
                if(goonSuccess)waitStudentsGetOn.countDown();
            }
 catch (InterruptedException e) {}
                
if(waitStudentsGetOn.getCount()!=0l){
                    System.out.println(
"还差:"+(waitStudentsGetOn.getCount())+" 个没上车");
                }
else{
                    System.out.println(
"都上车了");
                }

        }

        
        
    }

    
class Student{
        
private int myNum;//学生编号
         public Student(int num){
                
this.myNum = num;
          }

         
//上车
         public boolean getOn() throws InterruptedException{
             Thread.currentThread().sleep(
new Random().nextInt(2)*1000);//上车使用的时间,随机
             if(CountDownLatchTest.isGone){
                 
return false;//不能上了,上车失败
             }

             System.out.print(
"编号为:"+myNum+"的同学上车了..");
             
return true;
         }

    }

}


评论

# re: CountDownLatch 简介和例子  回复  更多评论   

2014-01-19 12:02 by bo_hai
carWaitTime = 3 是等待3秒吧?

# re: CountDownLatch 简介和例子  回复  更多评论   

2014-01-19 12:09 by bo_hai
这个模拟实例很好。博主对 CountDownLatch 理解很正确。

# re: CountDownLatch 简介和例子  回复  更多评论   

2014-12-14 14:06 by xsank
看到了countdownlatch的await用法,谢楼主分享

只有注册用户登录后才能发表评论。


网站导航: