java有学生窗口和普通窗口共2个窗口可以售票,请设计程序使用双线程实现2个窗口抢
时间: 2023-07-09 13:02:48 浏览: 95
以下是一个使用双线程实现两个窗口抢票的Java程序:
```java
public class TicketSaleSystem {
private static int totalTickets = 100; // 总票数
private static Object lock = new Object(); // 锁对象
public static void main(String[] args) {
Thread studentThread = new Thread(new TicketSeller("学生窗口"));
Thread normalThread = new Thread(new TicketSeller("普通窗口"));
studentThread.start(); // 启动学生窗口线程
normalThread.start(); // 启动普通窗口线程
}
static class TicketSeller implements Runnable {
private String windowName; // 窗口名称
public TicketSeller(String windowName) {
this.windowName = windowName;
}
@Override
public void run() {
while (totalTickets > 0) {
synchronized (lock) { // 使用lock对象进行同步
if (totalTickets > 0) {
System.out.println(windowName + "售出第" + totalTickets + "张票");
totalTickets--;
} else {
System.out.println("票已售罄");
}
}
try {
Thread.sleep(100); // 线程休眠100毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
```
上述程序中定义了一个`TicketSaleSystem`类,其中`totalTickets`表示总票数,`lock`表示用于同步的锁对象。`TicketSeller`类是一个实现`Runnable`接口的线程类,用于模拟窗口售票过程。在`run`方法中,使用`synchronized`关键字来同步对共享变量`totalTickets`的访问,确保多个窗口不能同时卖出同一张票。
在`main`方法中,创建了一个学生窗口线程和一个普通窗口线程,并启动它们。两个窗口线程会同时执行,通过竞争锁的方式来抢购剩余的票。当票数为0时,线程终止。
运行该程序后,可以在控制台上看到窗口售票的过程。
阅读全文