Semaphore基本使用场景
Semaphore的基本使用场景是限制一定数量的线程能够去执行.
举个简单的例子: 过年旅游,旅游景点要求只能每天进去1000个人, 而入口记录着当前已经在景区的人,检票进入,数量+1,离开景区,数量-1,这个示例相符合场景非常适合用信号量.
Semaphore在构造的时候, 可以传入一个int. 表示有多少许可(permit). 线程获取锁的时候, 要告诉信号量使用多少许可(还剩下多少门票), 当线程要使用的许可不足时, 则调用的线程则会被阻塞,只能在门口等着,有人出来才可以进入。
public static void main(String[] args) {
// 1. 创建 semaphore,同时在公园内的最多只能10个人
Semaphore semaphore = new Semaphore(10);
// 2. 来了100个人
for (int i = 0; i < 100; i++) {
final int index = i;
new Thread(() -> {
// 3. 买门票
try {
semaphore.acquire();
} catch (InterruptedException e) {
System.out.println("第"+index+"个人没有买到,回家睡觉");
}
try {
System.out.println("第"+index+"人观看景色中...");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("第"+index+"人观看景色完毕...");
} finally {
// 4. 释放许可
semaphore.release();
System.out.println("第"+index+"人离开景区...");
}
}).start();
}
}