用Java语言在项目中新建Test3.java:利用线程的同步及死锁,模拟售票系统及3个售票窗体的卖票过程,售票系统共有200张票,售票窗口分别是“广州”、“韶关”、“深圳”,每个窗口在访问系统票数时,其他线程不能访问系统票数。每卖一张票,请打印售票窗及所售卖的票编号。
时间: 2024-03-04 18:48:48 浏览: 56
以下是Java语言的代码实现:
```java
public class Test3 {
public static void main(String[] args) {
// 创建售票系统,共有200张票
TicketSystem system = new TicketSystem(200);
// 创建三个售票窗口,分别是“广州”、“韶关”、“深圳”
TicketWindow window1 = new TicketWindow("广州", system);
TicketWindow window2 = new TicketWindow("韶关", system);
TicketWindow window3 = new TicketWindow("深圳", system);
// 启动三个售票窗口
window1.start();
window2.start();
window3.start();
}
}
// 售票系统类
class TicketSystem {
private int total; // 总票数
public TicketSystem(int total) {
this.total = total;
}
// 获取剩余票数
public synchronized int getRemaining() {
return total;
}
// 售出一张票
public synchronized void sellTicket() {
if(total > 0) {
int ticketNumber = 200 - total + 1;
System.out.println(Thread.currentThread().getName() + "售出了第" + ticketNumber + "张票");
total--;
}
}
}
// 售票窗口类
class TicketWindow extends Thread {
private String name; // 窗口名称
private TicketSystem system; // 售票系统
public TicketWindow(String name, TicketSystem system) {
this.name = name;
this.system = system;
}
public void run() {
while(true) {
synchronized(system) { // 获取售票系统的锁
int remaining = system.getRemaining();
if(remaining > 0) {
// 售出一张票
system.sellTicket();
try {
Thread.sleep(100); // 模拟售票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
// 没有票了,退出售票
System.out.println(name + "没有票了,退出售票");
break;
}
}
}
}
}
```
在代码中,我们定义了一个`TicketSystem`类表示售票系统,有两个方法`getRemaining`和`sellTicket`,分别用于获取剩余票数和售出一张票。在`TicketWindow`类中,我们通过`synchronized`关键字来实现对售票系统的同步访问,确保同一时间只有一个窗口可以访问售票系统。最后,我们创建了三个售票窗口,分别启动这三个线程,模拟售票过程。
阅读全文