Semaphore

Semaphore

1.介绍

Semaphore 是一个计数信号量,必须由获取它的线程释放。常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流。

2.具体方法

  1. acquire()
    获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。
  2. acquire(int permits)
    获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。
  3. acquireUninterruptibly()
    获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。
  4. tryAcquire()
    尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。
  5. tryAcquire(long timeout, TimeUnit unit)
    尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。
  6. release()
    释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。
  7. hasQueuedThreads()
    等待队列里是否还存在等待线程。
  8. getQueueLength()
    获取等待队列里阻塞的线程数。
  9. drainPermits()
    清空令牌把可用令牌数置为0,返回清空令牌的数量。
  10. availablePermits()
    返回可用的令牌数量。

3.实现场景

模拟停车场停车,进来一辆,指示牌减一,出去一辆,指示牌加一,当指示牌显示为0时,禁止车辆进入。

public class Test_Semaphore {
    //停车场同时容纳的车辆10
    private static Semaphore semaphore=new Semaphore(10);
    public static void main(String[] args) {
        //模拟50辆车进入停车场
        for(int i=0;i<50;i++){
            Thread thread=new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("===="+Thread.currentThread().getName()+"来到停车场");
                        if(semaphore.availablePermits()==0){
                            System.out.println("车位不足,请耐心等待");
                        }
                        semaphore.acquire();//获取令牌尝试进入停车场
                        System.out.println(Thread.currentThread().getName()+"成功进入停车场");
                        Thread.sleep(new Random().nextInt(10000));//模拟车辆在停车场停留的时间
                        System.out.println(Thread.currentThread().getName()+"驶出停车场");
                        semaphore.release();//释放令牌,腾出停车场车位
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },i+"号车");
            thread.start();
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值