Java多线程之concurrent包(四)——Semaphore信号量
来源:互联网 发布:头条号刷阅读量软件 编辑:程序博客网 时间:2024/06/05 02:23
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
public class SemaphoreDemo { public static void main(String[] args) { Runnable limitedCall = new Runnable() { final Random rand = new Random(); //一共只有三个坑,没有释放的就等待 final Semaphore available = new Semaphore(3); public void run() { int time = rand.nextInt(15); try { available.acquire(); System.out.println("Executing " + "long-running action for " + time + " seconds... #" + Thread.currentThread().getName()); Thread.sleep(time * 1000); System.out.println("Done with #" + Thread.currentThread().getName() + "!"); available.release(); } catch (InterruptedException intEx) { intEx.printStackTrace(); } } }; for (int i=0; i<10; i++) new Thread(limitedCall).start(); }}
执行结果如下:
Executing long-running action for 7 seconds... #Thread-1Executing long-running action for 2 seconds... #Thread-2Executing long-running action for 14 seconds... #Thread-0Done with #Thread-2!Executing long-running action for 1 seconds... #Thread-3Done with #Thread-3!Executing long-running action for 4 seconds... #Thread-7Done with #Thread-1!Executing long-running action for 10 seconds... #Thread-9Done with #Thread-7!Executing long-running action for 1 seconds... #Thread-6Done with #Thread-6!Executing long-running action for 9 seconds... #Thread-5Done with #Thread-0!Executing long-running action for 6 seconds... #Thread-4Done with #Thread-9!Executing long-running action for 12 seconds... #Thread-8Done with #Thread-5!Done with #Thread-4!Done with #Thread-8!
可以从结果当中看出,线程1,2,0三个线程限制性。后续线程需要执行必须等到释放掉该信号量。
补充:
计数信号的一种特殊情况是互斥,或者互斥信号。互斥就是具有单一许可权的计数信号,意味着在给定时间仅一个线程可以具有许可权(也称为二进制信号)。互斥可以用于管理对共享资源的独占访问。
虽然互斥许多地方与锁定一样,但互斥还有一个锁定通常没有的其他功能,就是互斥可以由具有许可权的线程之外的其他线程来释放。这在死锁恢复时会非常有用。
0 0
- Java多线程之concurrent包(四)——Semaphore信号量
- concurrent包,多线程信号量Semaphore
- Java多线程工具之Semaphore(信号量)
- Java多线程之信号量Semaphore
- Java 多线程之信号量 Semaphore
- Java多线程之concurrent包(五)——CyclicBarrier
- Java多线程之concurrent包(六)——CountDownLatch
- java多线程之Semaphore信号量详解
- 我之见--java多线程信号量Semaphore
- java多线程之Semaphore信号量详解
- java多线程之Semaphore信号量详解
- java多线程之Semaphore信号量详解
- Java并发包之Semaphore信号量
- JAVA多线程--信号量(Semaphore)
- JAVA多线程--信号量(Semaphore)
- JAVA多线程--信号量(Semaphore)
- JAVA多线程--信号量(Semaphore)
- JAVA多线程--信号量(Semaphore)
- (总结)Nginx配置文件nginx.conf中文详解
- leetcode 221. Maximal Square
- WebApplicationContext初始化
- 关于iframe怎么使用有什么好处?
- Linux下的I/O复用与epoll详解
- Java多线程之concurrent包(四)——Semaphore信号量
- AIR客户端-高效处理图片缩略图的解决思路1
- 编辑界面案例分析,数据添加、移除、保存与取消操作
- block(data block,directory block)、inode、块位图、inode位图和super block概念详解
- mongodb入门
- 哈夫曼树类
- 线性代数:第一章 行列式(1)n阶行列式 行列式的性质
- C# 缓存技术(转)
- leetcode:Search a 2D Matrix 【Java】