17、利用线程实现以下功能:模拟三个人排队买票,张某、李某和赵某买电影票,售票员只有三张五元的钱,电影票5元钱一张。张某拿二十元一张的新人民币排在李的前面买票,李某排在赵的前面拿一张10元的人民币买票,赵某拿一张5元的人民币买票。
时间: 2024-04-04 20:30:58 浏览: 56
以下是基于 Java 语言的代码实现:
```java
public class TicketSellingDemo {
private static int money = 3 * 5; // 初始售票员的钱
private static Object lock = new Object(); // 共享对象锁
public static void main(String[] args) {
Thread zhang = new Thread(new Zhang()); // 张某买票线程
Thread li = new Thread(new Li()); // 李某买票线程
Thread zhao = new Thread(new Zhao()); // 赵某买票线程
zhang.start();
li.start();
zhao.start();
}
static class Zhang implements Runnable {
@Override
public void run() {
synchronized (lock) { // 加锁
while (money < 5) { // 判断是否有足够的钱找零
try {
lock.wait(); // 等待售票员找钱
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("张某买了一张票,给售票员一张20元的人民币");
money += 20; // 收钱
lock.notifyAll(); // 唤醒其他线程
}
}
}
static class Li implements Runnable {
@Override
public void run() {
synchronized (lock) { // 加锁
while (money < 10) { // 判断是否有足够的钱找零
try {
lock.wait(); // 等待售票员找钱
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("李某买了一张票,给售票员一张10元的人民币");
money += 10; // 收钱
lock.notifyAll(); // 唤醒其他线程
}
}
}
static class Zhao implements Runnable {
@Override
public void run() {
synchronized (lock) { // 加锁
while (money < 5) { // 判断是否有足够的钱找零
try {
lock.wait(); // 等待售票员找钱
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("赵某买了一张票,给售票员一张5元的人民币");
money += 5; // 收钱
lock.notifyAll(); // 唤醒其他线程
}
}
}
}
```
程序中使用了一个共享对象锁 `lock` 实现线程同步,每个买票线程在买票前都会先获取锁,判断是否有足够的钱找零,如果没有则等待售票员找零,如果有则进行买票操作,收钱后唤醒其他线程。每个线程执行完毕后都会释放锁。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)