- Java并发编程:核心方法与框架
- 高洪岩
- 328字
- 2023-01-19 15:09:14
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所示。
图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所示。
图1-13 许可被置0
执行方法drainPermits()返回可用的许可个数,并将可用许可数清零。