您的位置:首页 > 编程语言 > Java开发

Java并发包concurrent之CountDownLatch

2015-02-03 21:55 330 查看
   CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。换句话说,你可以并行的执行一段代码,并设置等待所有的线程都执行完的点,然后再一起开始执行。举例说,五个个人一起(并行)包饺子,只有等所有的饺子都包好以后才一起下锅,就这个意思咯。

其API相对来说比较简单:

构造方法:

CountDownLatch(int count)  

构造一个用给定计数初始化的 CountDownLatch 。

成员方法:

void await() 

使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。

boolean await(long timeout, TimeUnit unit) 

使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。

void countDown() 

递减锁存器的计数,如果计数到达零,则释放所有等待的线程。

long getCount() 

返回当前计数。

String toString() 

返回标识此锁存器及其状态的字符串。

下面我们来举一个例子,演示一下CountDownLatch的使用。

假如有两个工人都要每人都要完成一项工作,工人1需要5秒,工人2需要3秒,那么两个人并行开始工作,在相同的资源下,计算2个任务都花费的总时间,我们就可以使用CountDownLatch来等待2个工人都完成来计算时间。我们来用代码模拟一下:

工人1:

package cn.slimsmart.java.demo.concurrent;

import java.util.concurrent.CountDownLatch;

public class Worker1 implements Runnable{

private CountDownLatch latch;
public Worker1(CountDownLatch latch){
this.latch =latch;
}
@Override
public void run() {
System.out.println("工人1开始工作");
try {
System.out.println("工作中...");
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
System.out.println("工人1完成工作");
}

}
工人2:

package cn.slimsmart.java.demo.concurrent;

import java.util.concurrent.CountDownLatch;

public class Worker2 implements Runnable{

private CountDownLatch latch;
public Worker2(CountDownLatch latch){
this.latch =latch;
}
@Override
public void run() {
System.out.println("工人2开始工作");
try {
System.out.println("工作中...");
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
System.out.println("工人2完成工作");
}

}
计算花费时间:

package cn.slimsmart.java.demo.concurrent;

import java.util.concurrent.CountDownLatch;

public class CostTime {

public static void main(String[] args) throws InterruptedException {
CountDownLatch latch=new CountDownLatch(2);//两个线程并行
long time = System.currentTimeMillis();
new Thread(new Worker1(latch)).start();
new Thread(new Worker2(latch)).start();
latch.await();
System.out.println("总共花费时间:"+(System.currentTimeMillis()-time)+"ms");
}

}
运行结果:

工人1开始工作
工作中...
工人2开始工作
工作中...
工人2完成工作
工人1完成工作
总共花费时间:5011ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java