Java并发编程之工具类Semaphore的使用

网友投稿 245 2022-10-22


Java并发编程之工具类Semaphore的使用

一、Semaphore的理解

Semaphore属于java.util.concurrent包;

Semaphore翻译成字面意思为信号量,Semaphore可以控制同时访问的线程个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可。

二、Semaphore类中常用方法

public void acquire() 用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

public void acquire(int permits) 获取permits个许可。

public void release() 释放许可。注意,在释放许可之前,必须先获得许可。

public void release(int permits) 释放permits个许可。

注:以上4个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法。

public boolean tryAcquire() 尝试获取一个许可,若获取成功,则立即放回true,若获取失败,则立即返回false

public boolean tryAcquire(long timeout, TimeUnit unit) 尝试获取一个许可,若在指定的时间内获取成功,则立即放回true。否则立即返回false

public boolean tryAcquire(int permits) 尝试获取permits个许可。若获取成功,则立即放回true,,若获取失败,则立即返回false。

public boolean tryAcquire(int permits, long timeout, TimeUnit unit)尝试获取permits个许可。若在指定的时间内获取成功,则立即返回true,否则则立即返回false。

还可以通过availablePermits()方法得到可用的许可数目。

三、Semaphore类的使用示例

使用场景:

停车场容纳总停车量5,

停车场剩余车位不足时,车辆只能在外面等待。

每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。

当一辆车进入停车场后,显示牌的剩余车位数响应的减1.

1.代码

package com.xz.thread.Semaphore;

import java.util.Random;

import java.util.concurrent.Semaphore;

/**

* @description: 停车场容纳总停车量5,

* 停车场剩余车位不足时,车辆只能在外面等待。

* 每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。

* 当一辆车进入停车场后,显示牌的剩余车位数响应的减1.

* @author: xz

* @create: 2021-05-31 21:03

*/

public class Demo {

//停车场停车方法

public void stopCar(Semaphore semaphore){

System.out.println(Thread.currentThread().getName()+" 来到停车场。");

if(semaphore.availablePermits()==0){

System.out.println("车位不足,请耐心等待。。。。");

}

//获取令牌尝试进入停车场

try {

semaphore.acquire();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+" 成功进入停车场。");

//模拟车辆在停车场停留的时间

try {

Thread.sleep(new Random().nextInt(5000));

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+" 驶出停车场。");

//释放令牌,腾出停车场车位

semaphore.release();

}

public static void main(String[] args) {

Demo d=new Demo();

//停车场同时容纳的车辆5

Semaphore semaphore = new Semaphore(5);

//模拟10辆车进入停车场

for(int i=1;i<=10;i++){

new Thread(new Runnable() {

@Override

public void run() {

d.stopCar(semaphore);

}

},i+"号车").start();

}

}

}

2.运行main函数,输出结果如下:

1号车 来到停车场。

3号车 来到停车场。

3号车 成功进入停车场。

7号车 来到停车场。

1号车 成功进入停车场。

7号车 成功进入停车场。

2号车 来到停车场。

2号车 成功进入停车场。

8号车 来到停车场。

8号车 成功进入停车场。

4号车 来到停车场。

车位不足,请耐心等待。。。。

6号车 来到停车场。

车位不足,请耐心等待。。。。

5号车 来到停车场。

车位不足,请耐心等待。。。。

9号车 来到停车场。

车位不足,请耐心等待。。。。

10号车 来到停车场。

车位不足,请耐心等待。。。。

8号车 驶出停车场。

4号车 成功进入停车场。

4号车 驶出停车场。

6号车 成功进入停车场。

3号车 驶出停车场。

5号车 成功进入停车场。

1号车 驶出停车场。

9号车 成功进入停车场。

7号车 驶出停车场。

10号车 成功进入停车场。

2号车 驶出停车场。

6号车 驶出停车场。

10号车 驶出停车场。

5号车 驶出停车场。

9号车 驶出停车场。

  Process finished with exit code 0。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:2022软考网工笔记(组网技术上午题)
下一篇:4路电话光端机概述及产品特性详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~