使用多线程模拟汽车站售票员的售票过程。某班车共有10个座位,三个窗口的售票员都可以售卖该班车的座位票。每个售票员每次只能售卖一张,售完为止。分别通过继承Thread类和Runnable接口自定义售票员类,并在main方法中调用,观察这两种程序有何不同。总票数为非static整数变量。每售卖一张票,输出相关信息,如“售票员A-售出座位3,剩余7张票”。 通过继承Thread类定义售票员类的程序文件保存为EX9_4_1.java,通过继承Runnable接口定义售票员类的程序文件保存为EX9_4_2.java。
时间: 2023-11-27 18:50:08 浏览: 81
使用继承Thread类实现:
```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;
}
@Override
public void run() {
while (totalTickets > 0) {
synchronized (lock) { // 加锁
if (totalTickets > 0) {
System.out.println(name + "-售出座位" + totalTickets + ",剩余" + (--totalTickets) + "张票");
}
}
try {
Thread.sleep(100); // 休眠一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TicketSeller sellerA = new TicketSeller("售票员A");
TicketSeller sellerB = new TicketSeller("售票员B");
TicketSeller sellerC = new TicketSeller("售票员C");
sellerA.start();
sellerB.start();
sellerC.start();
}
}
```
使用实现Runnable接口实现:
```java
public class TicketSeller implements Runnable {
private static int totalTickets = 10; // 总票数
private static Object lock = new Object(); // 锁对象
private String name; // 售票员名称
public TicketSeller(String name) {
this.name = name;
}
@Override
public void run() {
while (totalTickets > 0) {
synchronized (lock) { // 加锁
if (totalTickets > 0) {
System.out.println(name + "-售出座位" + totalTickets + ",剩余" + (--totalTickets) + "张票");
}
}
try {
Thread.sleep(100); // 休眠一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TicketSeller sellerA = new TicketSeller("售票员A");
TicketSeller sellerB = new TicketSeller("售票员B");
TicketSeller sellerC = new TicketSeller("售票员C");
Thread t1 = new Thread(sellerA);
Thread t2 = new Thread(sellerB);
Thread t3 = new Thread(sellerC);
t1.start();
t2.start();
t3.start();
}
}
```
这两种实现方式的结果是一样的。使用实现Runnable接口的方式更灵活,因为Java不支持多重继承,如果已经有一个父类,就无法再继承Thread类了,但是可以实现Runnable接口。此外,实现Runnable接口还可以共享一个实例对象,而继承Thread类则需要创建多个实例对象。
阅读全文