Semaphore-一个计数信号量

  • 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。 每个release()添加许可证,潜在地释放阻塞获取方。 但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。
  • 信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源。
 //Semaphore主要用于限流
        // 在获得项目之前,每个线程必须从信号量获取许可证,以确保某个项目可用。 当线程完成该项目后,它将返回到池中,
        // 并将许可证返回到信号量,允许另一个线程获取该项目。 请注意,当调用acquire
         final int MAX_AVAILABLE = 4;
         Semaphore available = new Semaphore(MAX_AVAILABLE, true);
         for(int i =0;i<10;i++){
             new Thread(()->{
                 try {
                     available.acquire();  //加锁
                     System.out.println(Thread.currentThread().getName()+"****加锁");
                     TimeUnit.SECONDS.sleep(1);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }finally {
                     System.out.println(Thread.currentThread().getName()+"****减锁");
                     available.release();   //释放
                 }
             }).start();
         }

 

 

acquire

public void acquire()
             throws InterruptedException
从此信号量获取许可证,阻止直到可用,否则线程为interrupted

获得许可证,如果有可用并立即返回,则将可用许可证数量减少一个。

如果没有可用的许可证,那么当前线程将被禁用以进行线程调度,并且处于休眠状态,直至发生两件事情之一:

如果当前线程:

  • 在进入该方法时设置了中断状态; 要么
  • interrupted等候许可证,
然后InterruptedException被关上,当前线程的中断状态被清除。
异常
InterruptedException - 当前线程是否中断 
posted @ 2021-11-17 20:35  阿·超  阅读(59)  评论(0)    收藏  举报