• Index

Semaphore类

Last updated: ... / Reads: 38 Edit

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() 方法的线程数量。通过调整构造方法中的许可证数量,可以灵活地控制限流的级别。


Comments

Make a comment

  • Index