使用Semaphore模拟排队蹲坑

本文介绍如何使用Semaphore控制并发线程的数量,并通过一个模拟排队上厕所的例子来演示其工作原理。在示例中,5个厕位由Semaphore管理,8个人依次尝试获取许可使用厕位,若厕位满则等待。

什么是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,上完洗手间,脱坑.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值