tryAcquire 用法
- 尝试获取一个许可,参数有:许可数,等待时间,时间单位。
- 表示:在规定时间内等待,超过时间则抛弃。
package com.mmall.concurrency.example.aqs;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@Slf4j
public class SemaphoreExample3 {
private final static int threadCount = 20;
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < threadCount; i++) {
final int threadNum = i;
exec.execute(() -> {
try {
if (semaphore.tryAcquire()) { // 尝试获取一个许可
test(threadNum);
semaphore.release(); // 释放一个许可
}
} catch (Exception e) {
log.error("exception", e);
}
});
}
exec.shutdown();
}
private static void test(int threadNum) throws Exception {
log.info("{}", threadNum);
Thread.sleep(1000);
}
}
// 输出
0
2
1
分析
- 之前一直以为 acquire 是规定时间内,如果没获取到的就丢弃了,其实还是太年轻了,并不是这样的。
- acquire 在上一篇讲解到,如果阻塞住,就一直程序还是在跑的,而这个 tryAcquire 是真的规定时间内,没获取到的就丢弃了。
- 所以你会发现上面才输出 3 条。