美文网首页
JUC-工具类:3. Semaphore

JUC-工具类:3. Semaphore

作者: rock_fish | 来源:发表于2021-06-16 18:30 被阅读0次

    限流型,控制并发线程数

    功能概述

    1. 内置 一个许可证池,其中存放 数量有限、可循环使用的许可证
    2. 线程可申请许可证,如果池子中还有就申请的到,如果没有了就等待。线程使用完了许可证,可以归还到池子中。
    3. 一旦容易中有了,等待的线程就可以申请的到,继续执行。

    方法介绍

    1. 构造函数指定了许可证的个数;还有一个是否公平竞入
    2. acquire:
      如果许可证数量>1 ,领取一个,线程继续运行;如果许可证数量为0,线程阻塞等待,直到有其他线程归还许可证到池子中。
    3. release:
      归还许可证,池子中可用许可证个数+1,线程继续运行,如果有排队等待许可证的线程就唤醒它们去拿许可证。
    4. 有可中断和非阻塞版的方法。
    5. acquire(int permits) :
      一次申请多个许可证
    6. drainPermits :
      一次申请全部的许可证
    7. tryxxx:
      非阻塞式

    以下方法返回的数据可能不够精确,最好用来做评估参考
    int availablePermits() :返回此信号量中当前可用的许可证数。
    int getQueueLength():返回正在等待获取许可证的线程数。
    boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
    void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
    Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。

    场景案例

    假如去景区旅游,如果景区只允许同时100个人进入游玩,进入的游客必须领取准入证,那么前100个游客都可以直接领取准入证进入;当剩余证件为0的时候,来的客人只能再外边吃瓜等待,等里游客游玩结束,出来一个归还一个证件,排队等的就领取一个证件进入。也可以是一次要n个证件,如果剩余的够就准入,否则就继续等剩余游玩中的游客离开后归还了足够的证件。

    相关文章

      网友评论

          本文标题:JUC-工具类:3. Semaphore

          本文链接:https://www.haomeiwen.com/subject/xbavektx.html