CountDownLatch
CountDownLatch是多线程并发下可以使用的一个工具类,提供了计数等待的便捷功能。
具体看代码:
/**
* Author: ywx
* Create Time: 2023/4/18
* Description: 使用CountDownLatch工具类实现
*/
public class CountDownLatchTest02 {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(6);//countDown6次才唤醒等待的线程
for (int i = 1; i <= 6; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "号同学离开了教室");
countDownLatch.countDown(); //每调用一次countDown方法其内部计数器都会减一
}, String.valueOf(i)).start();
}
new Thread(() -> {
try {
countDownLatch.await(); //等待计数器为0时被唤醒
System.out.println(Thread.currentThread().getName() + "把门锁上了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "班长").start();
}
}
CyclicBarrier
该类也是多线程并发下可以使用的一个工具类,它允许一组线程全部等待彼此达到共同的屏障点。
public class CyclicBarrierTest01 {
private static final int NUMBER = 7;
public static void main(String[] args) {
//创建一个需要7个线程全部完成的CyclicBarrier,并提供完成后的行为
CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {
System.out.println("七颗龙珠已集齐,召唤神龙!!!");
});
for (int i = 1; i <= NUMBER; i++) {
final int finalI = i;
new Thread(() -> {
System.out.println("获得了" + finalI + "星龙珠!");
try {
cyclicBarrier.await(); //阻塞等待其他线程完成
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
/**
获得了4星龙珠!
获得了5星龙珠!
获得了1星龙珠!
获得了6星龙珠!
获得了2星龙珠!
获得了7星龙珠!
获得了3星龙珠!
七颗龙珠已集齐,召唤神龙!!!
**/
Semaphore
该类为多线程下的信号量资源,为其设定一个数量值n,最多有n个线程可以获取到Semaphore的资源。
public class SemaphoreTest01 {
public static void main(String[] args) {
//创建一个Semaphore信号量,最多三个线程同时获得
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6; i++) {
new Thread(() -> {
try {
semaphore.acquire(); //从semaphore中获取一个资源
System.out.println(Thread.currentThread().getName() + "进入了车位");
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); //释放该资源
}
}, "第" + i + "辆车").start();
}
}
}