写一个Java信号量复杂的使用例子
时间: 2024-10-14 17:02:45 浏览: 25
Java并发编程(23)并发新特性-信号量Semaphor
Java中的Semaphore是一种并发控制工具,用于限制同时访问特定资源的线程数。下面是一个复杂的Semaphore使用示例:
```java
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final int MAX_CONCURRENT_THREADS = 5; // 设置最大并发访问资源的数量
public static void main(String[] args) throws InterruptedException {
// 创建一个Semaphore实例
Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS);
// 创建一个任务列表,每个任务都需要访问资源
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 20; i++) { // 总共有20个任务需要运行,大于最大并发数
Runnable worker = () -> {
try {
// 获取锁,如果当前可用许可数小于指定值,则阻塞等待
semaphore.acquire();
System.out.printf("Thread %d is running with permission granted by semaphore%n", Thread.currentThread().getId());
// 执行任务,这里只是一个简单的模拟
// 进行一些耗时操作,比如数据库查询、网络请求等
Thread.sleep(1000);
// 完成任务后释放锁
semaphore.release();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
};
executor.execute(worker);
}
// 关闭线程池,允许未完成的任务结束
executor.shutdown();
// 等待所有任务执行完毕
while (!executor.isTerminated()) {
}
System.out.println("All tasks completed.");
}
}
阅读全文