您的位置:首页 > 其它

CountDownLatch的用法

2017-10-26 00:00 405 查看
摘要: CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

1.

package com.test.frame.test.countDownLatch;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

/**
* created by guanguan on 2017/10/26
**/
public class CountDownLatchDemo {

final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

static class Worker extends Thread {

private String workName;
private int workTime;
CountDownLatch latch;

public Worker(String workName, int workTime, CountDownLatch latch) {
this.workName = workName;
this.workTime = workTime;
this.latch = latch;
}

public Worker(Worker worker) {
}

@Override
public void run() {

System.out.println("worker : "+workName +"start begin at "+sdf.format(new Date()));
doWork();
System.out.println("worker : "+workName +"start complete at "+sdf.format(new Date()));

}

private void doWork() {

try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
latch.countDown();//工人完成工作,计数器减一

}
}
}

public static void main(String[] args) throws InterruptedException {
/**
* 初始化CountDownLatch,将其值置为2,latch计数器的操作是原子性的
*/
CountDownLatch latch=new CountDownLatch(2);

Worker worker1= new Worker("WORK-1",5000,latch);
Worker worker2= new Worker("WORK-2",2000,latch);
Worker worker3= new Worker("WORK-3",1000,latch);
worker1.start();
latch.await();      //此时将永远阻塞,因为只有一个线程开启,完成任务
worker2.start();
worker3.start();

}
}

运行结果是:
worker : WORK-1start begin at 2017-10-26 14:32:54
worker : WORK-1start complete at 2017-10-26 14:32:59

此时由于latch.await()的原因,则线程将永远阻塞,因为latch还是1,没有置为0,则线程2,线程3将无法进行

如果将 latch.await();      //此时将永远阻塞,因为只有一个线程开启,完成任务
worker2.start(); 这两行对换,

public static void main(String[] args) throws InterruptedException {
CountDownLatch latch=new CountDownLatch(2);//两个工人的协作

Worker worker1= new Worker("WORK-1",5000,latch);
Worker worker2= new Worker("WORK-2",2000,latch);
Worker worker3= new Worker("WORK-3",1000,latch);
worker1.start();
worker2.start();

latch.await();
worker3.start();

}

运行结果如下:

worker : WORK-2start begin at 2017-10-26 14:34:35
worker : WORK-1start begin at 2017-10-26 14:34:35
worker : WORK-2start complete at 2017-10-26 14:34:37
worker : WORK-1start complete at 2017-10-26 14:34:40
worker : WORK-3start begin at 2017-10-26 14:34:40
worker : WORK-3start complete at 2017-10-26 14:34:41

Process finished with exit code 0

表明线程1,线程2同时运行,并阻塞,然后1,2全部完成之后,线程3才开始运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CountDownLatch