Semaphore计数信号量

  ExecutorService exec = Executors.newCachedThreadPool();
  final Semaphore semp = new Semaphore(5);
  for(int i = 0; i <20 ; i ++){
     final int no = i;
     Runnable run = new Runnable(){
        try{
           semp.acquire();
           System.out.println("Accessing : " + no);
           Thread.sleep(1000000);
           semp.release();
        }catch(InterruptedException e){}
      };
    exec.execute(run);   }   exec.shutdown(); }

  信号量维护了一个许可集,若有必要,在许可可用前会阻塞每一个acquire(),然后再取得该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者,但不是用实际的许可对象。Semaphore只可对许可的号码进行认证,并采取相应的行动,拿到信号量的线程可以进入代码,否则就等待,通过acquire()和release()获取和释放访问许可。

  acquire():从信号量获得一个许可。在提供许可前线程一直被阻塞,否则线程被中断。获取一个许可并立即返回,将可用的许可数减1。若没有可用的许可,禁止将当前线程用于线程安排目的,并使其处于休眠状态,直到某些其它线程调用此信号量的release()方法,并且当前线程是下一个要被分配到许可的线程,或其他线程中断了当前线程。

  若当前线程的中断状态被设置为on或在等待许可时被中断,则会抛出InterruptException,并且清除当前线程的已中断状态。

  release():释放一个许可,将其返回给信号量。释放一个许可,将可用的许可数加1。若任意线程试图获取许可,则选中一个线程并将刚刚释放的许可给它,针对线程安排目的启用该线程,不要求释放的许可线程必须通过acquire()获取许可。

  

原文地址:https://www.cnblogs.com/forerver-elf/p/8302131.html