A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 29198102shihao 中级黑马   /  2013-7-22 22:02  /  1133 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

aemaphore信号灯,控制线程个数,如:一个文件只能同时被3个线程执行,固定个数的信号灯如3个,当有多个线程时,只能是先拿到信号灯的线程执行,同时只有三个线程在执行
main(){
ExecutorService service=Executors.newCachedThreadPool();
1final Semaphore sp=new Semaphore(3);默认随机分配给其他线程,final是为了让内部类使用
2final Semaphore sp=new Semaphore(3,true); 也可以让他公平分配,先进的线程先获得灯。
for(i<10){Runnable r=new Runnable(){run(){
sp.acquire();执行代码;sp.avaliablePermits();sp.release();用完释放等给其他线程};
获得信号灯;并显示还剩几盏灯可获得。
service.execute(r); }}扔进10个任务,开启10个线程,但只能同时执行3个线程

单个信号灯实现互斥功能,比锁要好!锁是那个线程拿到锁谁来释放,一旦抛异常,就不能再释放,必须用finally释放,而信号灯就算抛异常结束,也可自己sp.release();释放。

1 个回复

倒序浏览
+1++1看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马