
上QQ阅读APP看书,第一时间看更新

1.1.11 方法tryAcquire(int permits, long timeout, TimeUnit unit)的使用
有参方法tryAcquire(int permits, long timeout, TimeUnit unit)的作用是在指定的时间内尝试地获得x个许可,如果获取不到则返回false。
创建Java项目Semaphore_tryAcquire_4,将项目Semaphore_tryAcquire_3中的源代码复制到Semaphore_tryAcquire_4中,更改类Service.java代码如下:
package service; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class Service { private Semaphore semaphore = new Semaphore(3); public void testMethod() { //1改成3 try { if (semaphore.tryAcquire(3, 3, TimeUnit.SECONDS)) { System.out.println("ThreadName=" + Thread.currentThread().getName() + "首选进入!"); for (int i = 0; i < Integer.MAX_VALUE; i++) { String newString = new String(); Math.random(); } //方法release对应的permits值也要更改 semaphore.release(3); } else{ System.out.println("ThreadName=" + Thread.currentThread().getName() + "未成功进入!"); } } catch(InterruptedExceptione){ e.printStackTrace(); } } }
程序运行后的效果如图1-22所示。

图1-22 线程B未获得许可
更改Service.java类代码如下:
for (int i = 0; i < Integer.MAX_VALUE; i++) { }
程序运行结果如图1-23所示。

图1-23 都获得许可