首页 > 其他 > 详细

semaphore(信号量)使用说明

时间:2015-11-27 10:47:13      阅读:293      评论:0      收藏:0      [点我收藏+]
例子:
     以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。
    在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。
     更进一步,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。
    
     Java并发库Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
 
代码示例:
     
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);
               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();
 
                                   // 下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
                                   // availablePermits()指的是当前信号灯库中有多少个可以被使用
                                  System. out.println("线程" + Thread.currentThread().getName() + "已离开,当前已有" + (3 - sp.availablePermits()) + "个并发" );
                           }
                     };
                     service.execute(runnable);
              }
       }
 
}

semaphore(信号量)使用说明

原文:http://www.cnblogs.com/tstd/p/4999799.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!