JUC 强大的辅助类
CountDownLatch
计数器
CountDonwLatch 实例化可以赋一个初始值,
调用countdonw()方法,使值-1。
值不为0时会调用awiat()方法,值为0时继续执行await()后面的语句。
public static void main(String[] args) throws InterruptedException {
// 新建cuountdownlatch实例
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 0; i < 6; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 号同学离开了");
// 每次离开,计数器-1
countDownLatch.countDown();
}, String.valueOf(i)).start();
}
// 值不为0时会一直执行await方法,直到值为0时才会执行await后的代码
countDownLatch.await();
System.out.println("班长锁门");
}
CyclicBarrier
循环栅栏
同步辅助类,允许一组线程互相等待,直到达到某个公共屏障点(common barrier point)
构造方法中可以传入临界值(等待线程数)和Runnable实现类,当达到这个值时,会执行Runnable线程。
// 召集7颗龙珠可以召唤神龙
public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
final int NUMBER = 7;
// 创建CyclicBarrier实例
CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {
System.out.println("*** 召唤神龙 ***");
});
for (int i = 0; i < 7; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 星龙珠被搜集到了");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (BrokenBarrierException e) {
throw new RuntimeException(e);
}
}, String.valueOf(i)).start();
// 等待
}
}
Semaphore
信号灯
一个计数信号量,维护了一个许可数量集。
acqiuire方法,获取一个许可,线程唤醒,可以执行操作。
操作完成后有releas方法释放许可。
// 6辆汽车,停3个停车位
public static void main(String[] args) {
// 实例化Semaphore, 定义拥有3个许可
Semaphore semaphore = new Semaphore(3);
for (int i = 0; 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) {
throw new RuntimeException(e);
} finally {
// 释放许可
semaphore.release();
}
}, String.valueOf(i)).start();
}
}