Semaphore维护当前访问自身的线程个数
2015-11-25 17:30
387 查看
可以实现流量控制,同时访问文件的用户数
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);//创建Semaphore信号量,初始化许可大小为3 Runnable runnable = new Runnable(){ public void run(){ try { sp.acquire();//请求获得许可,如果有可获得的许可则继续往下执行,许可数减1。否则进入阻塞状态 } 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();//释放许可,许可数加1 //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元 System.out.println("线程" + Thread.currentThread().getName() + "已离开,当前已有" + (3-sp.availablePermits()) + "个并发"); } }; for(int i=0;i<10;i++){ service.execute(runnable); //提交十个任务 } } }
相关文章推荐
- C#通过Semaphore类控制线程队列的方法
- C#使用semaphore来管理异步下载请求的方法
- Python多线程同步Lock、RLock、Semaphore、Event实例
- JAVA 多线程之信号量(Semaphore)实例详解
- Python多进程同步Lock、Semaphore、Event实例
- java并发包里的semaphore的用法
- 多线程编程(2):线程的同步
- Threading in C#, phase 2
- RCU - Basics
- 生产者消费者模拟
- asp.net中需要创建唯一的序号
- win32多线程程序设计
- Delphi中最常用的三种线程同步技术
- C语言多线程编程《3个足球运动员》
- 多线程 冰淇淋店问题的实现
- mutex 和 semaphone 的区别 (1)
- Concurrent (4)
- 若干C笔试题
- win+apache实现ssl的证书认证[进一步的说明]
- 原子操作、信号量、读写信号量和自旋锁