CountDownLatch
作用:使一个线程等待其他线程各自执行完毕在执行,是通过一个计数器来实现的,初始值是线程的数量,每一个线程执行完毕计数器减一,当计数器为0时表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了
例子:
public static void main(String[] args){
final CountDownLatch downLatch=new CountDownLatch(2);
System.out.println(“主线程开始执行。。。”);
//第一个子线程执行
ExecutorsService service=Executors.newSingleThreadExecotor();
service.execute(new Runnable(){
@Override
public void run(){
Thread.sleep(3000);
Sytem.out.println(“子线程:”+Thread.currentThread.getName+“执行”);
downLatch.count();
}
})
service.shutdown();
//第二个子线程执行
ExecutorsService service1=Executors.newSingleThreadExecutor();
service1.execute(new Runnable(){
Thread.sleep(3000);
System.out.println(“子线程”+Thread.currentThread.getName+“执行”);
downLatch.count();
})
service1.shutdown();
System.out.println(“等待两个线程执行完毕。。。。。。”);
//堵塞
downLatch.await();
Sytem.out.println(“两个子线程执行完毕,继续执行主线程”);
}
CyclicBarrier
作用:栅栏类似于闭锁,他能阻塞一组线程直到某个事件的发生,闭锁与栅栏的关键区别在于所有线程必须同时到达栅栏位置才能继续执行。闭锁用于等待事件,而栅栏用于等待其他事件
CyclicBarier可以使一定数量的线程反复的在栅栏位置初汇集,栅栏到汇聚位置时将调用await方法,这个方法将阻塞直到所有线程都到达该位置,此时栅栏将打开,所有的线程统一执行,此时栅栏被重置以便下次使用
例子:
public static void main(String[] args){
int count=3;
CyclicBarier cb=new CyclicBarier(count);
for(int i=0;i<count;i++){
Thread thread=new Thread(new Runnable(){
System.out.println(Thread.currentThread().getName()+“开始等待其他线程”);
cb.await();
System.out.println(Thread.currentThread.getName()+“开始执行”);
//模拟业务处理
Thread.sleep(1000);
System.out.println(Thread.currendThread.getName()+“执行完毕”);
}).start();
}
}