`
sunbin
  • 浏览: 352597 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用Seamphore限制并发请求量(转)

 
阅读更多

一:认识Seamphore
  Seamphore信号量主要用来控制同时访问特定资源的线程数量,我们可以把它理解成用来限流用的。
  其主要方法如下:
  acquire(),获得许可,如果没获取到,会一直等待。
  acquire(int permits):获得permits个许可。
  tryAcquire(),尝试获得许可。
  release():释放许可。
  Collection<Thread> getQueuedThreads():返回所有等待获取许可的线程集合。
  boolean hasQueuedThreads():是否有线程在等待获取许可。
  int availablePermits():返回当前可以的许可证的数量。
  int getQueueLength():返回正在等待获取许可的线程数量。
二:举例说明
  模拟8个线程同时访问某个资源,采用Seamphore来控制并发访问量

Java代码  收藏代码
  1. public class SemaphoreExample {  
  2.    public static void main(String[] args) {  
  3.        ExecutorService service = Executors.newFixedThreadPool(10);  
  4.        final Semaphore semaphore = new Semaphore(5);  
  5.        final CountDownLatch countDownLatch = new CountDownLatch(1);  
  6.        for (int i = 1; i <= 8; i++) {  
  7.            final int index = i;  
  8.            service.submit(new Runnable() {  
  9.                @Override  
  10.                public void run() {  
  11.                    try {  
  12.                        semaphore.acquire();  
  13.                        System.out.println("获得许可:"  
  14.                                + Thread.currentThread().getName());  
  15.                        //不释放锁,模拟操作  
  16.                        Thread.sleep(1000);  
  17.                        System.out.println("释放许可:"  
  18.                                + Thread.currentThread().getName());  
  19.                        semaphore.release();  
  20.                        System.out.println("当前允许进入的最大任务数:" + semaphore.availablePermits());  
  21.                    } catch (InterruptedException e) {  
  22.                        e.printStackTrace();  
  23.                    } finally{  
  24.                        if(index == 8){  
  25.                            countDownLatch.countDown();  
  26.                        }  
  27.                    }  
  28.                }  
  29.            });  
  30.        }  
  31.        try {  
  32.            System.out.println("main线程等待:" + Thread.currentThread().getName());  
  33.            countDownLatch.await();  
  34.            System.out.println("模拟执行完毕.....");  
  35.            service.shutdown();  
  36.        } catch (InterruptedException e) {  
  37.            e.printStackTrace();  
  38.        }  
  39.    }  

 可能得运行结果如下: 

Java代码  收藏代码
  1. 获得许可:pool-1-thread-1  
  2. 获得许可:pool-1-thread-3  
  3. 获得许可:pool-1-thread-2  
  4. 获得许可:pool-1-thread-4  
  5. 获得许可:pool-1-thread-5  
  6. main线程等待:main  
  7. 释放许可:pool-1-thread-1  
  8. 当前允许进入的最大任务数:1  
  9. 获得许可:pool-1-thread-6  
  10. 释放许可:pool-1-thread-5  
  11. 释放许可:pool-1-thread-2  
  12. 当前允许进入的最大任务数:2  
  13. 获得许可:pool-1-thread-7  
  14. 释放许可:pool-1-thread-3  
  15. 当前允许进入的最大任务数:1  
  16. 获得许可:pool-1-thread-8  
  17. 当前允许进入的最大任务数:2  
  18. 释放许可:pool-1-thread-4  
  19. 当前允许进入的最大任务数:2  
  20. 释放许可:pool-1-thread-6  
  21. 当前允许进入的最大任务数:3  
  22. 释放许可:pool-1-thread-7  
  23. 当前允许进入的最大任务数:4  
  24. 释放许可:pool-1-thread-8  
  25. 当前允许进入的最大任务数:5  
  26. 模拟执行完毕.....  

  可以看到,每次最多5个线程并发执行,后面的线程必须等待。

分享到:
评论

相关推荐

    Python使用grequests(gevent+requests)并发发送请求过程解析

    Python使用grequests进行并发请求的过程包括以下几个重要知识点: 1. Python中的requests库:Python开发人员通常使用requests库来发送HTTP请求。requests库提供了一种简单易用的方法来处理HTTP/1.1协议,使用起来...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    总结,使用Spring MVC和Spring线程池处理HTTP并发请求,能够有效提升系统的并发处理能力。同时,通过数据同步控制策略,可以确保在多线程环境下数据的正确性和一致性。在实际开发中,我们需要结合业务需求,灵活运用...

    Oracle EBS创建并发请求

    Oracle EBS 创建并发请求 在 Oracle EBS 中创建并发请求是指通过存储过程、执行程序菜单、执行程序参数菜单和责任请求组菜单来实现的。以下是详细的知识点: 一、创建存储过程 在 Oracle EBS 中,存储过程是并发...

    C#(Csharp)多线程HTTP并发请求(HttpWebRequest)采集蜘蛛

    7. **性能优化**:通过调整并发请求数量(_reqCount),可以根据服务器的承受能力以及程序的内存和CPU使用情况来优化性能。同时,合理设置超时、重试策略以及错误处理机制也是保证爬虫稳定运行的关键。 总之,C#的多...

    EBS并发请求

    ### EBS并发请求详解 #### 一、EBS并发请求概览 EBS(Enterprise Business Suite)是Oracle公司提供的一套全面的企业应用解决方案,旨在帮助企业管理财务、供应链、人力资源等核心业务流程。其中,“并发请求”是...

    dubbo服务限制并发量示例

    本示例主要关注 Dubbo 的服务限制并发量的功能,这在高并发、大流量场景下至关重要,能够有效地保护服务提供者,避免因过量请求导致系统崩溃。我们将探讨 `executes` 和 `accepts` 两个关键配置,以及路由规则和服务...

    Android 下soap线程池并发请求

    使用线程池进行并发请求可以有效地管理多个并发任务,避免过度创建线程导致的资源浪费,同时提高响应速度。 三、设置SOAP请求参数 1. WSDL(Web Services Description Language):这是定义SOAP服务接口的XML文档,...

    微信小程序-控制微信小程序 wx.request 并发请求数量

    管理微信小程序 wx.request 方法的并发数,解决请求数大于 10 时,直接不请求的问题。如果需要 wx.request 方法支持 Promise,可以使用 wx-promise-request 库哦。 下载 由于小程序不支持 npm,所以直接右键保存 ...

    MultiHttp高性能的PHP封装的HTTPRestful多线程并发请求库

    4. **多线程并发请求**:在编程中,多线程允许同时执行多个任务,提高程序的执行效率。并发请求指的是在单个执行上下文中同时发送多个HTTP请求,提高了数据获取的速度。 5. **库**:在软件开发中,库是一组预先编写...

    简单实用的PHP并发请求url类

    为了解决这个问题,我们可以使用并发请求技术,将多个URL请求同时发送,从而提高整体的执行速度。以下是一个关于PHP实现并发URL请求的知识点详解: 1. **多线程与多进程**: 在PHP中,由于其默认是单线程的,我们...

    提高IIS的并发访问量,达到十万的并发

    除了上述步骤外,还可以通过其他方法来提高 IIS 的并发访问量,如使用负载均衡、图片和网站分离、CDN 等方法。 通过上述步骤,可以提高 IIS 的并发访问量,达到十万的并发。但是,需要根据实际情况进行调整和优化,...

    nginx 限制ip、并发量、连接数等配置

    在运维过程中,为了保障服务器稳定性和安全性,通常需要对访问进行一定的限制,包括限制特定IP、控制并发连接数以及设定连接数上限。本文将详细介绍如何在Nginx配置中实现这些功能。 一、限制特定IP访问 在Nginx...

    解决Ajax 发送多个请求引发的并发问题

    1. 请求队列:浏览器为了防止过多并发请求导致服务器压力过大,通常会对同一域名下的Ajax请求设置限制,比如Chrome允许同时进行六个同源请求。 2. 请求顺序:默认情况下,Ajax请求是异步的,这意味着它们可能按照...

    普元超并发限制

    在IT行业中,尤其是在分布式系统和云计算领域,"超并发限制"是一个常见的问题,尤其是在使用普元这样的中间件或平台服务时。普元是中国知名的软件基础平台提供商,其产品包括服务总线、工作流引擎等,广泛应用于企业...

    使用wget脚本模拟http并发请求

    对于并发请求,`wget`提供了`--limit-rate`(限制下载速度)和`--concurrent-connections`(指定同时连接数)等参数,可以让我们自定义下载行为,从而模拟不同的并发场景。在我们的场景中,我们将主要关注`--...

    Python并发请求下限制QPS(每秒查询率)的实现代码

    前两天有一个需求,需要访问某API服务器请求数据,该服务器限制了QPS=2(哈哈应该都知道是哪个服务器了吧_(:з」∠)_),因为QPS很小所以就使用阻塞式请求。后来开通了服务,QPS提高到了20,阻塞式请求满足不了这个QPS...

    .NET MVC5单位时间内请求次数限制

    在.NET MVC5框架中,开发人员常常需要处理网站性能和安全性的问题,其中之一就是如何有效地限制单位时间内的请求次数,以防止恶意并发请求和过滤非法请求。`MvcThrottle`是一个强大的解决方案,它允许开发者实现...

    大并发大数据量请求的处理方法

    2. **增加IIS的appConcurrentRequestLimit**:此设置限制了同一时间IIS可处理的并发请求数量,默认值为5000,可以根据需求调整到100000。这可以通过命令行工具`appcmd.exe`修改,或者直接编辑`applicationHost....

    asp.net通过消息队列处理高并发请求(以抢小米手机为例)

    在探讨***通过消息队列处理高并发请求的场景中,以抢购小米手机为例,我们可以学习到以下几个关键知识点: 1. 高并发处理的必要性:在Web应用中,尤其是在抢购活动或者促销中,瞬间会涌入大量用户请求对服务器进行...

    jmeter模拟ip并发http请求jmx

    jmeter 模拟ip http请求 并发测试 压力测试

Global site tag (gtag.js) - Google Analytics