java Semaphore(信号量)

学习java这么久,今天才接触到Semaphore(信号量)。惭愧啊,特此记录一下用法。

Semaphore的作用:

Semaphore是操作系统的信号量,用来控制同一时间访问的线程数,当超过可执行的线程数时,后面的线程将被挂起,直到正在执行的线程释放资源

Semaphore的用法:

Semaphore semaphore = new Semaphore(5);

构造函数中的参数表示同一时间可以执行的线程数,默认为1;

获取许可:
try {
                        //请求许可
                        semaphore.acquire();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

只有获取了许可之后,该线程才能够执行,否则将被挂起。

释放资源:
semaphore.release();

当线程获取许可之后并执行完之后,释放资源可使其他的线程获取到许可

这里以一个车库的例子作为演示,一个车库只有5个车位,同时来了20辆车,进入5辆车之后,其余的车进行等待,如果有车离开了车库,后面等待的车子就可以进入,离开一辆,就多了一个空位,离开2辆就多了2个空位,这时候排队的2辆车就可以进入了

代码如下:
public class TestMain {
    public static void main(String[] args) {
        //最多有5个线程同时并发执行
        Semaphore semaphore = new Semaphore(5);

        for (int i = 0; i < 20; i++) {
            new Thread("thread-->" + i) {
                @Override
                public void run() {
                    try {
                        //请求许可
                        semaphore.acquire();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":进入车库");
                    try {
                        Thread.sleep((long) Math.random() * 6000);
                    } catch (Exception e) {

                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":准备离开车库");
                    //访问完释放资源
                    semaphore.release();
                    //当前信号灯库里面有多少资源可以用
                    System.out.println(Thread.currentThread().getName() + ":已经离开车库,剩余车位:" + semaphore.availablePermits());

                }
            }.start();
        }
    }

}

执行的结果如下:
thread-->0:进入车库
thread-->3:进入车库
thread-->2:进入车库
thread-->1:进入车库
thread-->4:进入车库
thread-->0:准备离开车库
thread-->11:进入车库
thread-->0:已经离开车库,剩余车位:1
thread-->4:准备离开车库
thread-->4:已经离开车库,剩余车位:1
thread-->5:进入车库
thread-->1:准备离开车库
thread-->1:已经离开车库,剩余车位:1
thread-->6:进入车库
thread-->2:准备离开车库
thread-->2:已经离开车库,剩余车位:1
thread-->7:进入车库
thread-->3:准备离开车库
thread-->3:已经离开车库,剩余车位:1
thread-->8:进入车库
thread-->11:准备离开车库
thread-->11:已经离开车库,剩余车位:1
thread-->9:进入车库
thread-->5:准备离开车库
thread-->8:准备离开车库
thread-->8:已经离开车库,剩余车位:1
thread-->7:准备离开车库
thread-->6:准备离开车库
thread-->13:进入车库
thread-->7:已经离开车库,剩余车位:1
thread-->10:进入车库
thread-->12:进入车库
thread-->5:已经离开车库,剩余车位:1
thread-->9:准备离开车库
thread-->9:已经离开车库,剩余车位:1
thread-->15:进入车库
thread-->14:进入车库
thread-->6:已经离开车库,剩余车位:1
thread-->13:准备离开车库
thread-->13:已经离开车库,剩余车位:1
thread-->16:进入车库
thread-->10:准备离开车库
thread-->14:准备离开车库
thread-->17:进入车库
thread-->15:准备离开车库
thread-->12:准备离开车库
thread-->19:进入车库
thread-->15:已经离开车库,剩余车位:1
thread-->17:准备离开车库
thread-->16:准备离开车库
thread-->14:已经离开车库,剩余车位:0
thread-->18:进入车库
thread-->10:已经离开车库,剩余车位:1
thread-->16:已经离开车库,剩余车位:3
thread-->17:已经离开车库,剩余车位:2
thread-->19:准备离开车库
thread-->19:已经离开车库,剩余车位:4
thread-->12:已经离开车库,剩余车位:1
thread-->18:准备离开车库
thread-->18:已经离开车库,剩余车位:5

以上是Semaphore的简单使用方法!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值