JUC强大的辅助类
1.减少计数CountDownLatch
2.循环栅栏CyclicBarrier
3.信号灯Semaphore
减少计数CountDownLatch演示
package juc;
import java.util.concurrent.CountDownLatch;
//演示 CountDownLatch
public class CountDownLatchDemo {
//6个同学陆续离开教室之后,班长锁门
public static void main(String[] args) throws InterruptedException {
//创建CountDownLatch对象,设置初始值
CountDownLatch countDownLatch = new CountDownLatch(6);
//6个同学陆续离开教室之后
for (int i=1; i <=6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"号同学离开了教室");
//计数 -1
countDownLatch.countDown();
},String.valueOf(i)).start();
}
//等待(变为0等待结束)
countDownLatch.await();
System.out.println(Thread.currentThread().getName()+"班长锁门走人了");
}
}
循环栅栏CyclicBarrier演示
package juc;
import java.util.concurrent.CyclicBarrier;
//集齐7颗龙珠就可以召唤神龙
public class CyclicBarrierDemo {
//创建固定值
private static final int NUMBER = 7;
public static void main(String[] args) {
//创建CyclicBarrier
CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, ()->{
System.out.println("集齐7颗龙珠就可以召唤神龙");
});
//集齐7颗龙珠过程
for (int i=1; i <=7; i++) {
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"龙珠被收集到了");
//等待
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
信号灯Semaphore演示
package juc;
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
//6辆汽车,停3个车位
public class SemaphoreDemo {
public static void main(String[] args) {
//创建Semaphore,设置许可数量
Semaphore Semaphore = new Semaphore(3);
//模拟6辆汽车
for (int i=1; i <=6; i++) {
new Thread(()->{
try {
//抢占
Semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"抢到了车位");
//设置随机停车时间
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
System.out.println(Thread.currentThread().getName()+"离开了车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//释放
Semaphore.release();
}
},String.valueOf(i)).start();
}
}
}