zoukankan      html  css  js  c++  java
  • 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()获取许可。

      

  • 相关阅读:
    学习笔记之Linux开发(C语言)
    Shell脚本文件操作
    学习笔记之Shell脚本的输出重定向
    学习笔记之正则表达式 (Regular Expressions)
    学习笔记之#pragma
    eclipse启动不了报错java was started but returned exit code=13
    学习笔记之APACHE ANT
    学习笔记之Linux / Shell
    学习笔记之DB2 9 Fundamentals 730
    windows远程关机重启
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/8302131.html
Copyright © 2011-2022 走看看