Java并发编程:核心方法与框架
上QQ阅读APP看书,第一时间看更新

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()返回可用的许可个数,并将可用许可数清零。