请编写一个示例程序展示如何使用 Semaphore 类控制对共享资源的并发访问数量。
下面是一个简单的 Semaphore 示例,用于限制同时访问资源的线程数:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
public static void main(String[] args) {
int permits = 3; // 设置最大并发访问数
Semaphore semaphore = new Semaphore(permits);
ExecutorService executorService = Executors.newFixedThreadPool(10);
Runnable task = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire(); // 获取许可
System.out.println(Thread.currentThread().getName() + " 获得许可");
Thread.sleep(2000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放许可
System.out.println(Thread.currentThread().getName() + " 释放许可");
}
}
};
for (int i = 0; i < 10; i++) {
executorService.submit(task);
}
executorService.shutdown();
}
}
在上述示例中,我们创建了一个具有 3 个许可的 Semaphore 对象,表示最多允许 3 个线程同时访问资源。我们使用 ExecutorService 创建了一个包含 10 个线程的线程池,但由于 Semaphore 的限制,只有 3 个线程可以同时执行任务。