应用Java使用多线程模拟汽车站售票员的售票过程。某班车共有10个座位,三个窗口的售票员都可以售卖该班车的座位票。每个售票员每次只能售卖一张,售完为止。分别通过继承Thread类和Runnable接口自定义售票员类,并在main方法中调用,观察这两种程序有何不同。总票数为非static整数变量。每售卖一张票,输出相关信息,如“售票员A-售出座位3,剩余7张票”。通过继承Thread类定义售票员类的程序文件保存为
时间: 2023-11-27 20:51:27 浏览: 101
售票员类:
```java
public class TicketSeller extends Thread {
private static int totalTickets = 10;
private static Object lock = new Object(); // 定义锁对象,确保线程安全
private String name;
public TicketSeller(String name) {
this.name = name;
}
public void run() {
while (true) {
synchronized (lock) { // 加锁
if (totalTickets > 0) {
System.out.println(name + "-售出座位" + (10 - totalTickets + 1) + ",剩余" + (--totalTickets) + "张票");
} else {
break; // 票已售完,退出循环
}
}
}
}
}
```
主程序:
```java
public class Main {
public static void main(String[] args) {
// 通过继承Thread类自定义售票员类
TicketSeller sellerA = new TicketSeller("售票员A");
TicketSeller sellerB = new TicketSeller("售票员B");
TicketSeller sellerC = new TicketSeller("售票员C");
// 通过实现Runnable接口自定义售票员类
// TicketSeller sellerA = new TicketSeller("售票员A");
// Thread threadA = new Thread(sellerA);
// TicketSeller sellerB = new TicketSeller("售票员B");
// Thread threadB = new Thread(sellerB);
// TicketSeller sellerC = new TicketSeller("售票员C");
// Thread threadC = new Thread(sellerC);
sellerA.start();
sellerB.start();
sellerC.start();
// threadA.start();
// threadB.start();
// threadC.start();
}
}
```
通过继承Thread类定义售票员类的程序文件已保存。如果使用实现Runnable接口自定义售票员类,只需要将代码注释中的部分取消注释即可。
阅读全文