JAVA多线程——Semaphore
模拟信号灯:6辆汽车,只有三个停车位,每次只能停放三辆汽车,剩下的汽车需等待前面的汽车开走之后才能进入停放。
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* @author huangdh
* @version 1.0
* @description: 信号灯
* @date 2022-10-30 11:35
*/
public class SemaphoreDemo {
/**
* * Semaphore
* 一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。
* 每个release()添加许可证,潜在地释放阻塞获取方。 但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。
*
* 模拟信号灯:6辆汽车,只有三个停车位,每次只能停放三辆汽车,剩下的汽车需等待前面的汽车开走之后才能进入停放
* @param args
*/
public static void main(String[] args) {
// 创建 Semaphore ,设置许可数量
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 20; i++) {
new Thread(()->{
// 抢占
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "抢到车位了");
// 设置随机停车的时间
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "----------离开车位了");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}
运行结果:
0抢到车位了
3抢到车位了
1抢到车位了
1----------离开车位了
3----------离开车位了
5抢到车位了
2抢到车位了
0----------离开车位了
6抢到车位了
6----------离开车位了
4抢到车位了
4----------离开车位了
8抢到车位了
2----------离开车位了
7抢到车位了
7----------离开车位了
8----------离开车位了
5----------离开车位了