java并发编程之Semaphore

本文介绍了Semaphore类的主要方法及其在Java并发编程中的应用。通过一个火车站售票场景的示例,展示了如何利用Semaphore来控制同时访问特定资源的线程数量。

1.Semaphore主要方法

Semaphore(int permits):构造方法,创建具有给定许可数的计数信号量并设置为非公平信号量。

Semaphore(int permits,boolean fair):构造方法,当fair等于true时,创建具有给定许可数的计数信号量并设置为公平信号量。

void acquire():从此信号量获取一个许可前线程将一直阻塞。相当于一辆车占了一个车位。

void acquire(int n):从此信号量获取给定数目许可,在提供这些许可前一直将线程阻塞。比如n=2,就相当于一辆车占了两个车位。

void release():释放一个许可,将其返回给信号量。就如同车开走返回一个车位。

void release(int n):释放n个许可。

int availablePermits():当前可用的许可数。

2.示例

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。

比如一个火车站,只有3个售票点,所以要控制流量。假设有10个人要买票,现在只允许3个人同时去对应的售票点买票,只有这3个人中有人完成了购票操作,后面的人才能允许进入。

public class SemaphoreDemo extends Thread {
    private Semaphore semaphore;
    private String name;
​
    public SemaphoreDemo(Semaphore semaphore, String name) {
        this.semaphore = semaphore;
        this.name = name;
    }
​
    @Override
    public void run() {
        //返回此信号量中当前可用的许可证数
        int i = semaphore.availablePermits();
        if (i > 0) {
            System.out.println(name + ":我有抢票的资格了");
        } else {
            System.out.println(name + ":好可惜啊");
        }
​
        try {
            //获得许可证
            semaphore.acquire();
            System.out.println(name + ":我要开抢了");
            //模拟抢票时间
            Thread.sleep(new Random().nextInt(1000));
            System.out.println(name + ":终于抢到票了");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //释放许可证
            semaphore.release();
        }
    }
​
    public static void main(String[] args) {
        Semaphore s = new Semaphore(3);
        for (int i = 1; i <= 10; i++) {
            SemaphoreDemo semaphore = new SemaphoreDemo(s, i + "");
            semaphore.start();
        }
    }
}
在代码中,虽然有10个线程在执行,但是只允许3个并发的执行。

执行流程:

1:我有抢票的资格了
1:我要开抢了
2:我有抢票的资格了
2:我要开抢了
3:我有抢票的资格了
3:我要开抢了
4:好可惜啊
5:好可惜啊
6:好可惜啊
7:好可惜啊
8:好可惜啊
9:好可惜啊
10:好可惜啊
2:终于抢到票了
4:我要开抢了
3:终于抢到票了
5:我要开抢了
5:终于抢到票了
6:我要开抢了
1:终于抢到票了
7:我要开抢了
4:终于抢到票了
8:我要开抢了
8:终于抢到票了
9:我要开抢了
7:终于抢到票了
10:我要开抢了
10:终于抢到票了
9:终于抢到票了
6:终于抢到票了
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值