CountDownLatch 就是一个减法计数器,它可以设置一个数量,等待指定数量线程数执行完毕再放开阻塞
主要方法: countDown数量-1 await等待计数器归0再放行
public static void main(String[] args) throws InterruptedException {
//总数是6个线程,必须6个线程都执行完了再关闭
CountDownLatch countDownLatch = new CountDownLatch(6);
for (Integer i = 1; i <= 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"执行完毕");
//计数器-1
countDownLatch.countDown();
},String.valueOf(i)).start();
}
//等待计数器归零再向下执行
countDownLatch.await();
System.out.println("close,已关闭");
}
CyclicBarrier 就是一个加法计数器,设置一个数量和一个方法A,当多个线程执行到一定数量的时候就会回调A方法
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("集齐七颗龙珠,召唤成功");
});
for (int i = 1; i <= 7; i++) {
new Thread(()->{
System.out.println("收集第"+Thread.currentThread().getName()+"颗龙珠");
try {
//执行到7就执行声明时候指定的线程方法,并且放行
cyclicBarrier.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (BrokenBarrierException e) {
throw new RuntimeException(e);
}
},String.valueOf(i)).start();
}
System.out.println("执行完毕");
}
Semaphore(使用的非常多) 比如一个停车场有3个停车位,来了6辆车,先进来3辆停着,然后出去一个车再进来一个车,依次执行 一般实现限流使用
主要方法:
- acquier获取/得到,如果已经满了就等待有释放的再进入,其实就是信号量-1(减少一个车位)
- releas释放会让当前的信号量+1(有一个车位了)
public class SemaPhoreTest {
public static void main(String[] args) {
//停车位数量,其实就是线程数量
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6; i++) {
new Thread(()->{
try {
//acquier得到,就是抢到了车位
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"抢到了车位");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+"离开了车位");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}finally {
//releas释放,释放车位
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}