一个 闩 , 一个 屏障 ,都是障碍物!只要达到特定条件时,才能移除,继续同行!
CountDownLatch ?
- 闭锁,管理一个和多个线程,只有满足某个条件才能运行!就像一个闩一样,如果你没有满足我的条件,那么就别想出去!
用给定的计数 (count)初始化 CountDownLatch。由于调用了 countDown() 方法(count--),所以在当前计数到达零之前,await
方法会一直受阻塞。计数无法被重置,计数==0时释放所有等待的线程;
应用场景 : 将一个任务分为n个独立的部分,等这些部分都完成后继续接下来的任务
重要的API :
构造方法 : CountDownLatch(int count) // count 是线程数目?它是你可以调用countDown()的次数!
countDown() // 线程的数目-1
await() // 除非被中断 或者 Latch的count = 0 , 否则一直等待!
CyclicBarrier ?
- 循环屏障!
API :
构造方法 : CyclicBarrier(int parties)
await() // 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞。
// 他会返回达到线程的索引
public class CountLatch { // ...
public static void main(String[] args) throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(5);
for (int i = 0; i < 5; ++i) // create and start threads
new Thread(new Worker(startSignal, doneSignal)).start();
doSomethingElse(); // don't let run yet
startSignal.countDown(); // let all threads proceed 如果不运行这个那么就会一直wait
doSomethingElse();
doneSignal.await(); // wait for all to finish
}
private static void doSomethingElse() {
System.out.println("dodo.....");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void run() {
try {
startSignal.await();//只要startSignal的 count = 0 线程才能通过!‘闩’
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
void doWork() {
System.out.println(Thread.currentThread().getName() + " " + new Date());
}
}