java.util.concurrent.Semaphore
是 Java 中用于实现信号量的类。它是并发包(concurrent package)中的一部分,提供了对资源访问的控制。
Semaphore 类有以下常用构造方法:
- Semaphore(int permits): 创建一个具有指定数量许可证的 Semaphore。
- Semaphore(int permits, boolean fair): 创建一个具有指定数量许可证的 Semaphore,并指定是否使用公平性策略来获取许可证。公平性策略会按照请求许可证的顺序进行处理。
除了常用的构造方法外,Semaphore 还提供了以下常用方法:
- void acquire() throws InterruptedException: 获取一个许可证,如果没有可用的许可证,则线程将被阻塞。如果线程在等待期间被中断,则会抛出 InterruptedException 异常。
- void release(): 释放一个许可证,使其可供其他线程使用。
- boolean tryAcquire(): 尝试获取一个许可证,如果成功获取则返回 true,否则返回 false。
- int availablePermits(): 返回当前可用的许可证数量。
Semaphore 的典型应用场景之一是限流。通过设置 Semaphore 的许可证数量,可以控制同时访问某个资源的线程数量,从而达到限制流量的目的。下面是一个简单的示例代码,演示了如何使用 Semaphore 实现限流:
import java.util.concurrent.Semaphore;
public class RateLimiter {
private Semaphore semaphore;
public RateLimiter(int permits) {
semaphore = new Semaphore(permits);
}
public void doRequest() {
try {
semaphore.acquire(); // 获取一个许可证
// 执行请求操作
System.out.println("Processing request...");
Thread.sleep(1000); // 模拟请求处理时间
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放许可证
}
}
}
在上述示例中,RateLimiter 类使用 Semaphore 来控制同时执行 doRequest() 方法的线程数量。通过调整构造方法中的许可证数量,可以灵活地控制限流的级别。