java 一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒 要求: 请用多线程模拟卖票过程并打印剩余电影票的数量
时间: 2024-09-08 15:04:47 浏览: 71
为了模拟Java中多线程卖票的过程,并在两个窗口同时处理请求,你可以创建一个简单的多线程场景。我们将使用`Thread`类来创建两个售票窗口,并使用`synchronized`关键字来保证并发安全,防止竞态条件。以下是简化的示例代码:
```java
import java.util.concurrent.atomic.AtomicInteger;
class MovieTicket {
private static AtomicInteger remainingTickets = new AtomicInteger(1000);
public static void main(String[] args) {
Thread window1 = new Window("窗口1", () -> sellTicket());
Thread window2 = new Window("窗口2", () -> sellTicket());
// 启动两个窗口
window1.start();
window2.start();
try {
// 等待所有任务完成
window1.join();
window2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("剩余电影票数量: " + remainingTickets.get());
}
private static synchronized void sellTicket() {
if (remainingTickets.decrementAndGet() <= 0) {
System.out.println(Thread.currentThread().getName() + " 已售罄");
} else {
System.out.println(Thread.currentThread().getName() + " 卖出一张票, 剩余: " + remainingTickets.get());
}
}
}
class Window extends Thread {
private String name;
private Runnable task;
public Window(String name, Runnable task) {
this.name = name;
this.task = task;
}
@Override
public void run() {
System.out.println(name + " 开始售票...");
task.run(); // 执行卖票操作
}
}
```
在这个例子中,我们有一个全局变量`remainingTickets`用于记录剩余的电影票。每个窗口都有自己的`sellTicket`方法,它们是同步的,因此不会同时减少剩余票数。当票数达到0时,会停止卖票。
阅读全文