(1) 编写一个多线程程序,模拟火车售票窗口的售票功能。创建2个售票窗口,通过这两个窗口共同售出100张车票。 (2)利用Thread.sleep()方法模拟网络延时,采用同步代码块或同步方法保证上述售票过程中处理共享资源(100张票)时的线程安全性。
时间: 2025-01-01 20:40:59 浏览: 12
(1)首先,我们可以使用Java编写一个多线程程序来模拟火车售票窗口。这里是一个简单的示例:
```java
import java.util.concurrent.atomic.AtomicInteger;
class Ticket implements Runnable {
private static AtomicInteger ticketCount = new AtomicInteger(100);
private int windowId;
public Ticket(int id) {
this.windowId = id;
}
@Override
public void run() {
while (ticketCount.get() > 0) {
if (isWindowAvailable()) {
System.out.println("Window " + windowId + ": Selling ticket " + ticketCount.decrementAndGet());
// 模拟网络延时
try {
Thread.sleep(500); // 500毫秒代表网络延时
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Window " + windowId + ": Waiting for a ticket...");
}
}
System.out.println("Window " + windowId + ": All tickets sold out.");
}
private boolean isWindowAvailable() {
return ticketCount.get() > 0; // 窗口只有在还有票的情况下才可用
}
}
public class TrainTicketOffice {
public static void main(String[] args) {
Thread window1 = new Thread(new Ticket(1));
Thread window2 = new Thread(new Ticket(2));
window1.start();
window2.start();
}
}
```
在这个例子中,我们创建了两个`Ticket`对象并分别放入两个线程中运行。每个线程检查是否有票可卖,如果有就减去一张,并打印出售票信息。
(2)为了保证处理共享资源(票的数量)时的线程安全性,我们可以在`isWindowAvailable()`方法上添加同步机制,这里使用synchronized关键字:
```java
private synchronized boolean isWindowAvailable() {
if (ticketCount.get() > 0) {
return true;
} else {
return false;
}
}
// 同样,修改Ticket.run()里的同步代码块
while (true) {
synchronized (this) {
if (ticketCount.get() > 0) {
break;
}
try {
wait(); // 当没有票时等待其他线程唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// ...其他操作...
}
```
现在,当一个窗口试图购买票时,会先获取锁并检查是否有票。如果没有,它会释放锁并进入等待状态。另一个窗口则可以继续尝试,直到有票可用。这样就实现了线程安全地共享资源。
阅读全文