使用场景 :
主要是可以控制访问特定资源的线程数量。
下面我来用一个案例来介绍一下semaphore的用法
需求:
模拟收费站进出车辆,设立两个进出站窗口
实现步骤 :
1,创建一个semaphore对象来管理这个通道
2,当有车进来了,发通行许可证
3,当车出去了,收回通行许可证
4,如果通行许可证发完了,那么其他车辆只能等着
代码实现: 测试类:
public class demo {
public static void main(String[] args) {
myrunnable mr = new myrunnable();
for (int i = 0; i < 100; i++) {
new Thread(mr).start();
}
}
}
线程实现类:
public class myrunnable implements Runnable{
//1.创建管理员对象
private Semaphore semaphore = new Semaphore(2);
//Semaphore是公共的,所以得使用成员变量共享
@Override
public void run() {
//2.获取通行证
try {
semaphore.acquire();
//3.开始行使
System.out.println("获取通行证开始行使车辆");
Thread.sleep(2000);
//4.归还通行证
System.out.println("归还通行证");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
semaphore注意事项: 把他当做一个管理员对象即可 Semaphore semaphore = new Semaphore(2); 这个数值有多少通道就填多少数字
Thanks