美文网首页
主要并发工具类-Semaphore的使用

主要并发工具类-Semaphore的使用

作者: 飞奔吧牛牛 | 来源:发表于2020-02-11 05:40 被阅读0次

    Semaphore 是信号量的意思,通过信号量可以对同一资源访问做数量的限制。
    同一时刻最多有多少线程访问,超过的就要等待,当之前的线程让出去时,后面的线程才能继续访问。

            Semaphore semaphore = new Semaphore(10);
            Random random = new Random();
            //开启100个线程
            for (int i = 0; i < 100; i++) {
                new Thread(() -> {
                    try {
                        //最多有10个线程申请许可成功,其他线程阻塞在这里!
                        semaphore.acquire();
                        System.out.println(Thread.currentThread().getName() + " 从信号量申请许可");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //使用随机数设置占用资源时间
                    try {
                        int time = random.nextInt(10) * 100;
                        Thread.sleep(time);
                        System.out.println(Thread.currentThread().getName() + " 占用资源" + time + "毫秒");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //释放许可给信号量
                    semaphore.release();
                    System.out.println(Thread.currentThread().getName() + " 释放许可,将其返回信号量");
                }, "线程->" + i).start();
            }
    

    结果:

    线程->0 从信号量申请许可
    线程->1 从信号量申请许可
    线程->2 从信号量申请许可
    线程->3 从信号量申请许可
    线程->4 从信号量申请许可
    线程->5 从信号量申请许可
    线程->6 从信号量申请许可
    线程->7 从信号量申请许可
    线程->8 从信号量申请许可
    线程->9 从信号量申请许可
    线程->8 占用资源0毫秒
    线程->10 从信号量申请许可
    线程->8 释放许可,将其返回信号量
    线程->2 占用资源300毫秒
    线程->7 占用资源300毫秒
    线程->2 释放许可,将其返回信号量
    线程->11 从信号量申请许可
    线程->12 从信号量申请许可
    线程->7 释放许可,将其返回信号量
    线程->6 占用资源400毫秒
    线程->6 释放许可,将其返回信号量
    ......
    线程->93 释放许可,将其返回信号量
    线程->92 占用资源400毫秒
    线程->95 占用资源300毫秒
    线程->92 释放许可,将其返回信号量
    线程->95 释放许可,将其返回信号量
    线程->97 占用资源300毫秒
    线程->97 释放许可,将其返回信号量
    线程->86 占用资源800毫秒
    线程->86 释放许可,将其返回信号量
    线程->84 占用资源900毫秒
    线程->84 释放许可,将其返回信号量
    线程->99 占用资源400毫秒
    线程->99 释放许可,将其返回信号量
    线程->88 占用资源900毫秒
    线程->88 释放许可,将其返回信号量
    线程->98 占用资源600毫秒
    线程->98 释放许可,将其返回信号量
    线程->90 占用资源900毫秒
    线程->90 释放许可,将其返回信号量
    线程->96 占用资源900毫秒
    线程->96 释放许可,将其返回信号量
    

    相关文章

      网友评论

          本文标题:主要并发工具类-Semaphore的使用

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