CountDownlLatch
一个线程和多个线程,等待另外一个线程或者多个线程之后才继续执行,CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法。这个方法让线程进入休眠状态直到等待的所有线程都执行完成。每调用一次countDown()方法内部计数器减1,直到计数器为0时唤醒。这个可以理解为特殊的CyclicBarrier。线程同步点比较特殊,为内部计数器值为0时开始。
CyclicBarrier
多个线程之间相互等待,允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行。CyclicBarrier可以传入另一个Runnable对象作为初始化参数。当所有的线程都到达集合点后,CyclicBarrier类将Runnable对象作为线程执行
例子1(等待集合完毕,然后kill)
public class CountDownLatchDemo {
private CountDownLatch countDownLatch=new CountDownLatch(1);
public void begin(){
System.out.println("i am coming!");
try {
countDownLatch.await();
System.out.println(" i am over");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void end(){
System.out.println("you will be killed!");
countDownLatch.countDown();
}
}
public class CountDownTest {
public static void main(String [] args)throws Exception{
CountDownLatchDemo countDownLatchDemo=new CountDownLatchDemo();
SyncThread syncThread=new SyncThread(countDownLatchDemo);
SyncThread syncThread2=new SyncThread(countDownLatchDemo);
syncThread.start();
syncThread2.start();
Thread.sleep(2000);
countDownLatchDemo.end();
}
}
例子二(凑够两个,然后kill两个)
public class CyclicBarrierDemo extends Thread {
private CyclicBarrier cyclicBarrier;
public CyclicBarrierDemo(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier=cyclicBarrier;
}
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " coming");
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName() + "over");
}catch (Exception e){
}
}
}
public class CyclicBarrierTest {
public static void main(String[] args)throws Exception{
CyclicBarrier cyclicBarrier=new CyclicBarrier(2, new Runnable() {
@Override
public void run() {
System.out.println("double kill!!!");
}
}
);
for(int i=0;i<10;i++){
new CyclicBarrierDemo(cyclicBarrier).start();
}
}
}