Semaphore案例

1.

public class Semaphore implements java.io.Serializable{
    // 最多支持N个资源访问
    public Semaphore(int permits){};

    // 获取可用的资源
    // 如果可用,信号量内部的资源个数减掉1
    // 如果没有可用资源线程会阻塞在该方法中,不能结束该方法,不能返回,直到有可用的资源为止
    public void acquire() throws InterruptedException{};

    // 当前可用的资源个数,permits - availablePermits() = 正在使用的资源个数
    public int availablePermits(){
        return 0;
    };

    // 释放资源,释放后信号量内部的资源个数会增加1
    // 如果有被阻塞的线程,释放后会唤醒一个线程去获取资源
    // acquire() 和 release() 要成对使用,一半release() 放在finally代码块中
    public void release(){};
}

2.

public class SemaphoreTest1 {

    // 定义semaphore实例,设置许可数为10,即停车位为2个
    Semaphore semaphore = new Semaphore(2);

    public static void main(String[] args) {
        SemaphoreTest1 t = new SemaphoreTest1();
        new Thread(t::stop,"预A-SY281").start();
        new Thread(t::stop,"预B-SY666").start();
        new Thread(t::stop,"预C-SY777").start();
        new Thread(t::stop,"预D-SY888").start();
        new Thread(t::stop,"预E-SY999").start();
        new Thread(t::stop,"预F-SY595").start();
        new Thread(t::stop,"预G-SY317").start();

    }

    void stop(){
        String t = Thread.currentThread().getName();
        try {
            System.out.println(t + ":尝试进入停车场...");
            // 尝试获取许可,如果没有,则等待
            semaphore.acquire();
            // 模拟停车
            long time = (long) (Math.random() * 50 + 10);
            System.out.println(t + ":进入了停车场,停车" + time + "秒...");
            TimeUnit.SECONDS.sleep(time);
        } catch (InterruptedException e){
            e.printStackTrace();
        } finally {
            System.out.println(t + ":开始驶离停车场...");
            // 释放许可
            semaphore.release();
            System.out.println(t + ":离开了停车场!");
        }
    }
}

3.

public class SemaphoreTest2 {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 10; i++) {
            new Thread(new MyRunnable(semaphore),"第" + i + "个人").start();
        }

    }

    static class MyRunnable implements Runnable{
        private Semaphore semaphore;
        public MyRunnable(Semaphore semaphore){
            this.semaphore = semaphore;
        }

        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            int availablePermits = semaphore.availablePermits();
            if (availablePermits > 0){
                System.out.println(name + "无人,可用");
            } else {
                System.out.println(name + "有人,请排队。。。\t");
            }

            try {
                // 如果没有拿到资源将一直等待,直到有人释放,拿到资源
                semaphore.acquire();
                System.out.println(name + "轮到我了");
                // 模拟使用时间
                Thread.sleep(1000);
                System.out.println(name + "使用完毕\t");
            } catch (InterruptedException e){

            } finally {
                // 使用完释放资源
                semaphore.release();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值