![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=1738889344-i4QQlwj4IPzENnke4QFEbVfPCZBHSnHH-0-34bc5b6810835becc3e02aca93cccccf)
1.1.10 方法tryAcquire(long timeout, TimeUnit unit)的使用
有参方法tryAcquire(int long timeout, TimeUnit unit)的作用是在指定的时间内尝试地获得1个许可,如果获取不到则返回false。
创建Java项目Semaphore_tryAcquire_3,将项目Semaphore_tryAcquire_2中的源代码复制到Semaphore_tryAcquire_3中,更改类代码如下:
package service; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class Service { private Semaphore semaphore = new Semaphore(1); public void testMethod() { try { if (semaphore.tryAcquire(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(); } semaphore.release(); } else{ System.out.println("ThreadName=" + Thread.currentThread().getName() + "未成功进入!"); } //方法release对应的permits值也要更改 } catch (InterruptedException e) { e.printStackTrace(); } } }
程序运行后的效果如图1-20所示。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0030_0001.jpg?sign=1738889344-EVm3KIlQOSGP25IJzw5Txx7Q2LZcmcgt-0-72f305cbcf99b8eade9caf62d5399368)
图1-20 线程B未获得许可
更改Service.java类代码如下:
for (int i = 0; i < Integer.MAX_VALUE; i++) { //String newString = new String(); //Math.random(); }
程序运行结果如图1-21所示。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0030_0002.jpg?sign=1738889344-9f9q991jsNVSTOg8w6ijOQOrNcWU7qTW-0-819b4cc7412ae6acb63825d2b4e7e4ea)
图1-21 双双获得许可