并发常用辅助类

一、CountDownLatch

CountDownLatch是一个减法计数器,允许一个或多个线程等直到在其他线程中执行的一组操作完成的同辅助。

        每次有线程调用countDown()时数量 -1 ,countDownLatch.await()就会被唤醒,继续执行

常用方法:

        

countDownLatch.countDown() // 相当于-1操作
ountDownLatch.await(); //等待计数器归零,然后向下执行
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        //有必须要执行的任务的时候再使用
        CountDownLatch countDownLatch = new CountDownLatch(5);
        //countDownLatch.countDown(); // -1
        for (int i = 1; i <= 5; i++) {
            new Thread(()->{
                countDownLatch.countDown();
                System.out.println(Thread.currentThread().getName()+"Go!");
            },String.valueOf(i)).start();
        }
        countDownLatch.await(); //等待计数器归零,然后向下执行
        System.out.println("某行为");
    }
}

二、CyclicBarrier  

        CyclicBarrier是一个加法计数器,允许一组线程全部等待彼此达到共同屏障点的同步辅助。

        在new一个CyclicBarrier对象时,参数可以传一个int型,也可以传一个int型加一个Runnable接口。

CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{});
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
            System.out.println("进度条100%");
        });
        for (int i = 1; i <= 5; i++) {
            final int temp = i;
            //lambda不能拿到i
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"Loading..."+temp);
                try {
                    cyclicBarrier.await();//等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

 

三、Semaphore

 作用:多个共享资源的互斥使用;限流

//参数填默认线程数量
Semaphore semaphore = new Semaphore(5);
//获得,如果信号量已经满了,等待被释放为止
semaphore.acquire();
//释放,将当前的信号量释放,唤醒等待的线程
semaphore.release();

场景:抢车位  6辆车三个车位 

public class SemaphoreDemo {
    public static void main(String[] args) {
        //参数:线程数量  --- >  停车位
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"Park!");
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName()+"Leave!");
                } catch (InterruptedException e) {

                }finally {
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }


    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值