信号灯[ˈseməfɔːr]
public class SemaphoreDemo {
public static void main(String[] args) {
//令牌桶,有5个令牌
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 10; i++){
new DoAnything(i, semaphore).start();
}
}
static class DoAnything extends Thread{
private int num;
private Semaphore semaphore;
public DoAnything(int num, Semaphore semaphore){
this.num = num;
this.semaphore = semaphore;
}
//限制流量
@Override
public void run(){
try {
//获取令牌(从五个令牌中获取,获取不到令牌则阻塞)
semaphore.acquire();
System.out.println("第" + num + "线程进入");
Thread.sleep(2000);
//释放令牌(令牌释放后,semaphore.acquire会重新获得令牌)
semaphore.release();
System.out.println("第" + num + "线程释放");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果
第0线程进入
第2线程进入
第1线程进入
第3线程进入
第4线程进入
第0线程释放
第3线程释放
第8线程进入
第2线程释放
第4线程释放
第1线程释放
第9线程进入
第6线程进入
第5线程进入
第7线程进入
第9线程释放
第7线程释放
第6线程释放
第5线程释放
第8线程释放
Process finished with exit code 0
网友评论