使用java实现网络购票需求说明各方人士共同抢10张票限黄牛党只能抢一张票
实现网络购票的Java代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
class Ticket {
private static final int TOTAL_TICKETS = 10;
private static final int MAX_TICKETS_PER_PERSON = 1;
private static final int MAX_CONNECTIONS = 5;
private static Semaphore ticketSemaphore;
private static Semaphore connectionSemaphore;
private static List<String> buyers;
static {
ticketSemaphore = new Semaphore(TOTAL_TICKETS);
connectionSemaphore = new Semaphore(MAX_CONNECTIONS);
buyers = new ArrayList<>();
}
public static class Buyer implements Runnable {
private String name;
public Buyer(String name) {
this.name = name;
}
@Override
public void run() {
try {
connectionSemaphore.acquire();
if (!buyers.contains(name)) {
ticketSemaphore.acquire();
System.out.println(name + "抢到了一张票");
buyers.add(name);
} else {
System.out.println(name + "已经抢到了一张票,不能再抢了");
}
connectionSemaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
Thread buyerThread = new Thread(new Buyer("买家" + i));
buyerThread.start();
}
}
}
在上述代码中,使用了Semaphore来控制并发访问的数量。ticketSemaphore控制票的数量,connectionSemaphore控制同时连接的人数。
每个买家线程在抢票之前会先尝试获取一个连接信号量,如果获取成功,则继续执行,否则等待。在获取连接信号量后,买家线程会检查自己是否已经抢到了票,如果没有,则尝试获取一张票的信号量。如果成功获取到票的信号量,则抢到了一张票,否则表示票已经被抢完了。最后,买家线程释放连接信号量。
运行上述代码,可以看到输出结果类似于以下内容:
买家1抢到了一张票
买家2抢到了一张票
买家3抢到了一张票
买家4抢到了一张票
买家5抢到了一张票
买家6抢到了一张票
买家7抢到了一张票
买家8抢到了一张票
买家9抢到了一张票
买家10抢到了一张票
买家11已经抢到了一张票,不能再抢了
买家12已经抢到了一张票,不能再抢了
买家13已经抢到了一张票,不能再抢了
买家14已经抢到了一张票,不能再抢了
买家15已经抢到了一张票,不能再抢了
买家16已经抢到了一张票,不能再抢了
买家17已经抢到了一张票,不能再抢了
买家18已经抢到了一张票,不能再抢了
买家19已经抢到了一张票,不能再抢了
买家20已经抢到了一张票,不能再抢了
可以看到,前10个买家线程都成功抢到了一张票,后面的买家线程因为已经抢到了一张票,所以无法再抢。这样就实现了限制“黄牛党”只能抢一张票的需求
原文地址: http://www.cveoy.top/t/topic/ib1q 著作权归作者所有。请勿转载和采集!