semaphore信号量使用

时间:2020-12-08 15:14:29

semaphore允许 指定数量的线程同时运行,比如有5件商品,现在同时有10个人同时在买,只允许前面5个买成功

class Work implements  Runnable{
private Semaphore sem;

public Work(Semaphore sem){
this.sem=sem;
}

@Override
public void run() {
try {
System.out.println("正在获取许可,thread id:"+Thread.currentThread().getId());
sem.acquire(); //获取许可
System.out.println("我拿到了许可,可以执行了,thread id:"+Thread.currentThread().getId());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
finally {
sem.release(); //释放许可证
}
}
}

 public static void main(String[] args) {
Semaphore sem=new Semaphore(2);
new Thread(new Work(sem)).start();
new Thread(new Work(sem)).start();
new Thread(new Work(sem)).start();
new Thread(new Work(sem)).start();
}

执行结果:

正在获取许可,thread id:11
我拿到了许可,可以执行了,thread id:11
正在获取许可,thread id:14
我拿到了许可,可以执行了,thread id:14
正在获取许可,thread id:13
正在获取许可,thread id:12
我拿到了许可,可以执行了,thread id:13
我拿到了许可,可以执行了,thread id:12