JUC之常见辅助类

CountDownLatch

        同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。

常用方法:

        countDown():每调用一次计数器值-1,直到count被减为0

        getCount():获取当前计数器的值

        await(): 等待计数器变为0,即等待所有异步线程执行完毕

使用场景:

        1. 某个线程需要在其他n个线程执行完毕后再向下执行
        2. 多个线程并行执行同一个任务,提高响应速度

示例:

public class CountDownLaunchTest {
    public static void main(String[] arge) throws InterruptedException{
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for(int i=1;i<=6;i++){
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"GO");
                countDownLatch.countDown();  //数量减1
            }).start();
        }
        countDownLatch.await();    //等待计数器归零,再向下执行
        System.out.println(Thread.currentThread().getName()+"OUT");
    }
}

CyclicBarrier

一个可循环利用的屏障;

作用:

        让所有线程都等待完成后才会继续下一步行动

常用方法:

        await():等待

public static void main(String[] arge) throws InterruptedException{
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("召唤神龙成功");
        });

        for(int i=1;i<=7;i++){
            final int term = i;

            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"收集了"+term+"颗龙珠");

                try{
                    cyclicBarrier.await();
                }catch (Exception e){
                    e.printStackTrace();
                }

            }).start();
        }
    }

Semaphore

使用场景是限制一定数量的线程能够去执行

常用方法:

        acquire() 线程占用一个许可.

        release() 释放一个许可

    public static void main(String[] arge) throws InterruptedException{
        Semaphore semaphore = new Semaphore(3);

        for(int i=1;i<=6;i++){
            new Thread(()->{
                try{
                    semaphore.acquire();//得到
                    System.out.println(Thread.currentThread().getName()+"抢到了车位");
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName()+"离开了车位");
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    semaphore.release();//释放
                }

            },String.valueOf(i)).start();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值