CyclicBarrier例子
package com.cangku;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Cyclic implements Runnable {
private CyclicBarrier cyclicBarrier;
public Cyclic(CyclicBarrier cyclicBarrier) {
super();
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "准备好了...");
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "起跑");
}
public static void main(String[] args) {
CyclicBarrier cyc = new CyclicBarrier(5);
for (int i = 0; i < 5; i++) {
new Thread(new Cyclic(cyc)).start();;
}
}
}
结果:Thread-1准备好了...
Thread-4准备好了...
Thread-0准备好了...
Thread-3准备好了...
Thread-2准备好了...
Thread-2起跑
Thread-1起跑
Thread-0起跑
Thread-3起跑
Thread-4起跑
CountDownLatch
package com.cangku;
import java.util.concurrent.CountDownLatch;
public class Count implements Runnable{
private CountDownLatch countDownLatch;
public Count(CountDownLatch countDownLatch) {
super();
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
System.out.println("总共有"+countDownLatch.getCount()+"人打车");
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("开车");
}
public static void main(String[] args) {
CountDownLatch c = new CountDownLatch(5);
new Thread(new Count(c)).start();
for (int i = 0; i <5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"已到达");
c.countDown();
}
}).start();;
}
}
}
结果
总共有5人打车
Thread-2已到达
Thread-4已到达
Thread-3已到达
Thread-1已到达
Thread-5已到达
开车
CyclicBarrier一般是阻塞子线程
CountDownLatch是阻塞主线程