使用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,上完洗手间,脱坑.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值