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

被折叠的 条评论
为什么被折叠?



