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 。
获得许可证,如果有可用并立即返回,则将可用许可证数量减少一个。
如果没有可用的许可证,那么当前线程将被禁用以进行线程调度,并且处于休眠状态,直至发生两件事情之一:
- 一些其他线程调用此信号量的
release()方法,当前线程旁边将分配一个许可证; 要么 - 一些其他线程interrupts当前线程。
如果当前线程:
- 在进入该方法时设置了中断状态; 要么
- 是interrupted等候许可证,
InterruptedException被关上,当前线程的中断状态被清除。- 异常
InterruptedException- 当前线程是否中断

浙公网安备 33010602011771号