CountDownLatch
同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。
常用方法:
countDown():每调用一次计数器值-1,直到count被减为0
getCount():获取当前计数器的值
await(): 等待计数器变为0,即等待所有异步线程执行完毕
使用场景:
1. 某个线程需要在其他n个线程执行完毕后再向下执行
2. 多个线程并行执行同一个任务,提高响应速度
示例:
public class CountDownLaunchTest {
public static void main(String[] arge) throws InterruptedException{
CountDownLatch countDownLatch = new CountDownLatch(6);
for(int i=1;i<=6;i++){
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"GO");
countDownLatch.countDown(); //数量减1
}).start();
}
countDownLatch.await(); //等待计数器归零,再向下执行
System.out.println(Thread.currentThread().getName()+"OUT");
}
}
CyclicBarrier
一个可循环利用的屏障;
作用:
让所有线程都等待完成后才会继续下一步行动
常用方法:
await():等待
public static void main(String[] arge) throws InterruptedException{
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("召唤神龙成功");
});
for(int i=1;i<=7;i++){
final int term = i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"收集了"+term+"颗龙珠");
try{
cyclicBarrier.await();
}catch (Exception e){
e.printStackTrace();
}
}).start();
}
}
Semaphore
使用场景是限制一定数量的线程能够去执行
常用方法:
acquire() 线程占用一个许可.
release() 释放一个许可
public static void main(String[] arge) throws InterruptedException{
Semaphore semaphore = new Semaphore(3);
for(int i=1;i<=6;i++){
new Thread(()->{
try{
semaphore.acquire();//得到
System.out.println(Thread.currentThread().getName()+"抢到了车位");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+"离开了车位");
}catch (Exception e){
e.printStackTrace();
}finally {
semaphore.release();//释放
}
},String.valueOf(i)).start();
}
}