使用Semaphore模拟排队蹲坑
什么是Semaphore
Semaphore 翻译成字面意思为 信号量,Semaphore 可以控制同时访问的线程个数,通过acquire() 获取一个许可,release() 释放一个许可。如果没有许可就将进行等待状态。
流程如下图所示。
怎么使用Semaphore
1:创建一个Semaphore,在构造函数里指定许可总数量。 Semaphore holes=new Semaphore(5);
2:在线程执行开始位置 添加holes.acquire()获取许可。
3:在线程执行结束位置 添加 holes.release().
使用Semaphore模拟排队蹲坑
大概流程:
1:洗手间有5个坑,8个人排队找坑。
2:有坑的先占,无坑的等待。
3:占坑的脱坑,等待的入坑。
4:完成。
原代码
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public static void main(String[] args) {
//定义一个许可为5的信号量,表示 有5个坑。
Semaphore holes = new Semaphore(5);
//8个人排队找坑
for(int i=1;i<=8;i++)
{
new people(holes,i).start();
}
}
public static class people extends Thread
{
private Semaphore holes;
private int pIndex;
public people(Semaphore holes,int pIndex)
{
this.holes=holes;
this.pIndex=pIndex;
}
@Override
public void run()
{
System.out.println(String.format("我是路人%s,正在待坑",pIndex));
try {
this.holes.acquire();
System.out.println(String.format("我是路人%s,已占坑",pIndex));
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
holes.release();
System.out.println(String.format("我是路人%s,上完洗手间,脱坑.",pIndex));
}
}
}
输出结果
我是路人6,正在待坑
我是路人8,正在待坑
我是路人5,正在待坑
我是路人2,正在待坑
我是路人7,正在待坑
我是路人1,正在待坑
我是路人3,正在待坑
我是路人4,正在待坑
我是路人7,已占坑
我是路人2,已占坑
我是路人5,已占坑
我是路人8,已占坑
我是路人6,已占坑
我是路人4,已占坑
我是路人2,上完洗手间,脱坑.
我是路人7,上完洗手间,脱坑.
我是路人5,上完洗手间,脱坑.
我是路人8,上完洗手间,脱坑.
我是路人6,上完洗手间,脱坑.
我是路人1,已占坑
我是路人3,已占坑
我是路人1,上完洗手间,脱坑.
我是路人4,上完洗手间,脱坑.
我是路人3,上完洗手间,脱坑.