![Java并发编程:核心方法与框架](https://wfqqreader-1252317822.image.myqcloud.com/cover/235/822235/b_822235.jpg)
上QQ阅读APP看书,第一时间看更新
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/icon1.png?sign=1738829951-omy8SEFfAk2qB41qTnB3r1KydfGrzzEz-0-1725592984ee5a2f617e1fb09458d529)
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=1738829951-M3Z1u3X9fBTRVQ1nwWtZ0VgpfBxPvinv-0-f9068dc9c555c48c21edfc94a9cddb0d)
图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=1738829951-uBYTu8xOVyjWhvamsKEEa8IhKWOjEndn-0-f50aeba089914f0388cf18ab0d1b0d04)
图1-13 许可被置0
执行方法drainPermits()返回可用的许可个数,并将可用许可数清零。