• 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()获取许可。

      

  • 相关阅读:
    Go module学习笔记
    java并发基础及原理
    java并发之内存模型
    https理论及实践
    Mysql查询结果导出Excel表
    mysql清空表数据并重置自增ID
    html a标签链接点击闪动问题解决
    rocketmq-console控制台管理界面配置
    nginx多层反代配置变量proxy_set_header
    nginx 实现浏览器文件下载服务
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/8302131.html
Copyright © 2020-2023  润新知