JUC包下的便捷工具类

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();
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值