- Java并发编程:核心方法与框架
- 高洪岩
- 328字
- 2023-01-19 15:09:14
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/icon1.png?sign=1739473042-zQkgE7huWAD8DMoUVoJNc7W6hYyhBeSA-0-40f8c24ce38eb7ef9f1914e67006d0f8)
1.1.5 方法availablePermits()和drainPermits()
availablePermits()返回此Semaphore对象中当前可用的许可数,此方法通常用于调试,因为许可的数量有可能实时在改变,并不是固定的数量。
drainPermits()可获取并返回立即可用的所有许可个数,并且将可用许可置0。
创建测试用的项目availablePermitsTest,类MyService.java代码如下:
package myservice; import java.util.concurrent.Semaphore; public class MyService { private Semaphore semaphore = new Semaphore(10); public void testMethod() { try { semaphore.acquire(); System.out.println(semaphore.availablePermits()); System.out.println(semaphore.availablePermits()); System.out.println(semaphore.availablePermits()); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } }
类Run.java代码如下:
package test.run; import myservice.MyService; public class Run { public static void main(String[] args) { MyService service = new MyService(); service.testMethod(); } }
程序运行结果如图1-12所示。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0023_0001.jpg?sign=1739473042-M51ZvPEL499adUq3PjsRopLlW4wMm9tr-0-0d40c1430276c22d8303c3b6b7c7dd45)
图1-12 有效的许可数量
创建测试用的项目drainPermitsTest,将项目availablePermitsTest中的所有源代码复制到drainPermitsTest项目中,更改类MyService.java代码如下:
package myservice; import java.util.concurrent.Semaphore; public class MyService { private Semaphore semaphore = new Semaphore(10); public void testMethod() { try { semaphore.acquire(); System.out.println(semaphore.availablePermits()); System.out.println(semaphore.drainPermits() + " " + semaphore.availablePermits()); System.out.println(semaphore.drainPermits() + " " + semaphore.availablePermits()); System.out.println(semaphore.drainPermits() + " " + semaphore.availablePermits()); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } }
程序运行后的效果如图1-13所示。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0024_0001.jpg?sign=1739473042-xcAG8jv9E0opFBKF3cAmHkeXx1Sn5ZDH-0-3ad7b4294b21ac53d2f959e239134754)
图1-13 许可被置0
执行方法drainPermits()返回可用的许可个数,并将可用许可数清零。