JAVA中的并发工具类(一)----控制并发数的Semaphore
来源:互联网 发布:初级php开发工程师 编辑:程序博客网 时间:2024/06/01 08:57
本文使用的Demo可以在我的github中找到。
前面我们使用线程池技术来控制访问资源的线程数目,假设对某一文件的访问,我们允许几十个线程来读他,但是出于某种限制,我们要求只允许10个线程可以同时读该文件。这就好比十字路口有100辆车想要过马路,我们只允许其中的10辆车可以看到绿灯然后让他们通过马路。Semaphore就类似于这种情境下的红绿灯。
Semaphore的应用场景:可以用于做流量控制,特别是共用资源有限的应用场景,比如数据库连接。几十个线程要求访问数据库,但是我们只提供10个连接数,这个时候,我们可以使用Semaphore来做流量控制。
示例Demo:
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class SemaphoreTest{ public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); // 规定一个线程池 final Semaphore sp = new Semaphore(3); // 允许最大并发数为3 for (int i = 0; i < 10; i++) { // 开启十个线程。 Runnable runnable = new Runnable() { public void run() { try { sp.acquire(); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println( "线程" + Thread.currentThread().getName() + "进入,当前已有" + (3 - sp.availablePermits()) + "个并发"); try { Thread.sleep((long) (Math.random() * 10000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程" + Thread.currentThread().getName() + "即将离开"); sp.release(); // 下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元 System.out.println( "线程" + Thread.currentThread().getName() + "已离开,当前已有" + (3 - sp.availablePermits()) + "个并发"); } }; service.execute(runnable); } service.shutdown(); }}
运行结果如下:
线程pool-1-thread-2进入,当前已有3个并发线程pool-1-thread-1进入,当前已有3个并发线程pool-1-thread-3进入,当前已有3个并发线程pool-1-thread-1即将离开线程pool-1-thread-1已离开,当前已有3个并发线程pool-1-thread-4进入,当前已有3个并发线程pool-1-thread-4即将离开线程pool-1-thread-4已离开,当前已有2个并发线程pool-1-thread-5进入,当前已有3个并发线程pool-1-thread-5即将离开线程pool-1-thread-5已离开,当前已有2个并发线程pool-1-thread-7进入,当前已有3个并发线程pool-1-thread-3即将离开线程pool-1-thread-3已离开,当前已有2个并发线程pool-1-thread-8进入,当前已有3个并发线程pool-1-thread-2即将离开线程pool-1-thread-2已离开,当前已有2个并发线程pool-1-thread-10进入,当前已有3个并发线程pool-1-thread-8即将离开线程pool-1-thread-6进入,当前已有3个并发线程pool-1-thread-8已离开,当前已有3个并发线程pool-1-thread-6即将离开线程pool-1-thread-6已离开,当前已有2个并发线程pool-1-thread-9进入,当前已有3个并发线程pool-1-thread-9即将离开线程pool-1-thread-9已离开,当前已有2个并发线程pool-1-thread-7即将离开线程pool-1-thread-7已离开,当前已有1个并发线程pool-1-thread-10即将离开线程pool-1-thread-10已离开,当前已有0个并发
0 0
- JAVA中的并发工具类(一)----控制并发数的Semaphore
- 并发工具类(三)控制并发线程数的Semaphore
- 并发工具类(三)控制并发线程数的Semaphore
- (java多线程并发)控制并发线程数的Semaphore
- Java线程(CountDownLatch、CyclicBarrier、Semaphore)并发控制工具类
- java 并发工具类-Semaphore
- Java中的Semaphore--用于多线程中控制资源并发访问的线程数
- 控制并发线程数的Semaphore
- 控制并发线程数的Semaphore
- Semaphore控制线程并发数
- (java多线程并发)控制并发线程数的Semaphore、ScheduledThreadPoolExcutor、BlockingQueue、ReadWriteLock
- java并发中的Semaphore
- Java线程总结(九):并发包------控制并发线程数Semaphore
- Java并发工具类之Semaphore
- 第8章 Java中的并发工具类(CountDownLatch CyclicBarrier Semaphore Exchanger)
- Java并发学习(十五)-并发工具Semaphore
- 控制并发访问的线程数 Semaphore 信号灯
- Semaphore 控制并发访问线程数
- JAVA虚拟机入门(1)---------类文件结构(上)
- 计算几何简单模板
- 接口和抽象类的区别
- Java Web 初级程序员 -第6天学习内容:this,final,instance of
- AndroidStudio_常用快捷键_新手_精简版
- JAVA中的并发工具类(一)----控制并发数的Semaphore
- 《Windows核心编程》之“Windows挂钩”(二)
- Linux 信号
- node.js
- 开发者所需要知道的 iOS 10 SDK 新特性
- BZOJ1593: [Usaco2008 Feb]Hotel 旅馆 线段树
- gsoap入门:获取gsoap的错误信息
- db2安装完后,在/home/db2inst1/sqllib/include/目录下没有db2ApiDf.h等API头文件的问题
- 发送邮件的plsql代码(续)