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