CountDownLatch主要使用为两个方法,一个为await,一个为countDown,await用于主线程中,而countDown用于子线程中,而主线程需要先启动并且在子线程启动前调用await方法。
示例1:
package test;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest extends Thread{
private CountDownLatch latch;
private int index;
public CountDownLatchTest(CountDownLatch latch,int index){
this.latch = latch;
this.index = index;
}
public void run(){
for(int i = 0 ; i < 100 ; i++){
}
System.out.println("线程"+(index+1)+" 数完100,将暂停任务,等待指挥部的下一步通知。");
latch.countDown();
System.out.println("线程"+(index+1)+" 收到解除await的通知,继续开始下一步操作。");
}
public static void main(String[] args) {
int count = 4;
CountDownLatch latch = new CountDownLatch(count);
CountDownLatchMainTest mainTest = new CountDownLatchMainTest(latch);
mainTest.start();
for(int i = 0 ; i < count ; i++){
CountDownLatchTest test = new CountDownLatchTest(latch,i);
test.start();
}
}
}
class CountDownLatchMainTest extends Thread{
private CountDownLatch latch;
public CountDownLatchMainTest(CountDownLatch latch){
this.latch = latch;
}
public void run(){
System.out.println("指挥中心等待各方就位!");
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("收到各方就位通知,指挥中心开始运行!");
}
}
运行结果:
指挥中心等待各方就位!
线程4 数完100,将暂停任务,等待指挥部的下一步通知。
线程3 数完100,将暂停任务,等待指挥部的下一步通知。
线程2 数完100,将暂停任务,等待指挥部的下一步通知。
线程2 收到解除await的通知,继续开始下一步操作。
线程1 数完100,将暂停任务,等待指挥部的下一步通知。
线程3 收到解除await的通知,继续开始下一步操作。
线程4 收到解除await的通知,继续开始下一步操作。
收到各方就位通知,指挥中心开始运行!
线程1 收到解除await的通知,继续开始下一步操作。
由此可以看出:主线程调用await之后就进行等待状态,不再执行下面的内容。子线程调用countDown之后,控制中心CountDownLatch会将未完成任务的线程数量-1,直到为0然后唤醒主线程操作主线程的剩余任务。但是需要注意的一点,countDown方法执行之后子线程不会受任何影响,将直接继续下面的操作