ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程之Semaphore登录限流示例

2021-11-11 18:31:10  阅读:114  来源: 互联网

标签:登录 示例 loginQueue System 限流 semaphore println 多线程 out


public static void main(String[] args) {

        //允许最大的登录数
        int slots=10;
        ExecutorService executorService = Executors.newFixedThreadPool(slots);
        LoginQueueUsingSemaphore loginQueue = new LoginQueueUsingSemaphore(slots);
        //线程池模拟登录
        for (int i = 1; i <= slots; i++) {
            final int num=i;
            executorService.execute(()->{
                 if (loginQueue.tryLogin()){
                     System.out.println("用户:"+num+"登录成功!");
                 }else {
                     System.out.println("用户:"+num+"登录失败!");
                 }
            });
        }
        executorService.shutdown();


        System.out.println("当前可用许可证数:"+loginQueue.availableSlots());

        //此时已经登录了10个用户,再次登录的时候会返回false
        if (loginQueue.tryLogin()){
            System.out.println("登录成功!");
        }else {
            System.out.println("系统登录用户已满,登录失败!");
        }
        //有用户退出登录
        loginQueue.logout();

        //再次登录
        if (loginQueue.tryLogin()){
            System.out.println("登录成功!");
        }else {
            System.out.println("系统登录用户已满,登录失败!");
        }

    }
class LoginQueueUsingSemaphore{

    private Semaphore semaphore;

    /**
     *
     * @param slotLimit
     */
    public LoginQueueUsingSemaphore(int slotLimit){
        semaphore=new Semaphore(slotLimit);
    }

    boolean tryLogin() {
        //获取一个凭证
        return semaphore.tryAcquire();
    }

    void logout() {
        semaphore.release();
    }

    int availableSlots() {
        return semaphore.availablePermits();
    }
}

 

标签:登录,示例,loginQueue,System,限流,semaphore,println,多线程,out
来源: https://www.cnblogs.com/wujf/p/15541172.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有