使用多线程技术模拟排队买票: 模拟 2 人排队买票,张某和李某买电影票, 售票员只有 2 张 5元的钱,电影票 5 元钱一张。张某用一张 20 元的人民币排在李某的前面买票, 李某用一张 10 元的人民币买票。请通过编程模拟排队买票的情形。Java编写
时间: 2024-02-29 09:55:24 浏览: 81
排队买票多线程问题
好的,以下是使用 Java 多线程技术模拟排队买票的代码示例:
```
public class TicketSelling {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
new Thread(new Customer("张某", 20, seller)).start();
new Thread(new Customer("李某", 10, seller)).start();
}
}
class TicketSeller {
private int money = 0;
public synchronized void sellTicket(int amount) {
if (amount == 5) {
while (money < 5) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
money -= 5;
} else if (amount == 10) {
while (money < 10) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
money -= 10;
} else if (amount == 20) {
money += 20;
notifyAll();
return;
}
System.out.println(Thread.currentThread().getName() + " 买了一张票");
}
}
class Customer implements Runnable {
private String name;
private int money;
private TicketSeller seller;
public Customer(String name, int money, TicketSeller seller) {
this.name = name;
this.money = money;
this.seller = seller;
}
@Override
public void run() {
seller.sellTicket(20);
if (name.equals("张某")) {
seller.sellTicket(5);
seller.sellTicket(5);
seller.sellTicket(5);
} else if (name.equals("李某")) {
seller.sellTicket(5);
seller.sellTicket(5);
}
}
}
```
在这个示例中,我们创建了一个 `TicketSeller` 类,它有一个 `sellTicket` 方法,用于售票。这个方法是同步的,因此多个线程不能同时调用它。当顾客想要买票时,他们调用 `sellTicket` 方法,并传入票价。如果是 5 元的票,`sellTicket` 方法会检查售票员的钱箱中是否有足够的 5 元钞票,如果没有,则顾客需要等待。如果有足够的 5 元钞票,则售票员会从钱箱中取出一张,并将钞票数量减 1。
如果顾客想要买 10 元的票,则 `sellTicket` 方法会检查售票员的钱箱中是否有 10 元钞票。如果没有,则顾客需要等待。如果有,则售票员会从钱箱中取出一张,并将钞票数量减 1。
如果顾客想要买 20 元的票,则 `sellTicket` 方法会将 20 元钞票放入售票员的钱箱中,并唤醒所有等待的顾客线程继续执行。
在 `Customer` 类中,我们创建了两个顾客线程,分别是张某和李某。张某先买了一张 20 元的票,然后买了三张 5 元的票。李某先买了一张 5 元的票,然后买了一张 10 元的票。由于 `sellTicket` 方法是同步的,因此这两个顾客线程会按照一定的顺序执行,模拟排队买票的情形。
最终的输出结果可能是这样的:
```
张某 买了一张票
张某 买了一张票
张某 买了一张票
张某 买了一张票
李某 买了一张票
李某 买了一张票
```
阅读全文