假设有100张火车票,创建10个线程模拟10个售票点,每个售票点100毫秒卖一张票。打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。用java 编写代码
时间: 2024-02-21 21:02:09 浏览: 60
好的,这是一个简单的多线程编程问题,下面是代码实现:
```java
public class TicketSeller implements Runnable {
private static int totalTickets = 100; // 总票数
private static int ticketsSold = 0; // 已售票数
private static Object lock = new Object(); // 同步锁
private String name; // 售票点名称
public TicketSeller(String name) {
this.name = name;
}
@Override
public void run() {
while (ticketsSold < totalTickets) {
synchronized (lock) { // 加锁
if (ticketsSold < totalTickets) { // 还有票
ticketsSold++;
System.out.println(name + "售出第" + ticketsSold + "张票");
}
}
try {
Thread.sleep(100); // 模拟售票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
// 创建10个线程模拟10个售票点
for (int i = 1; i <= 10; i++) {
new Thread(new TicketSeller("售票点" + i)).start();
}
}
}
```
在上面的代码中,我们使用了一个静态变量`totalTickets`表示总票数,一个静态变量`ticketsSold`表示已售票数,以及一个静态对象`lock`作为同步锁。每个售票点在售票时都会先尝试获取`lock`的锁,如果获取成功,则判断是否还有票可以卖,如果还有,则售出一张票,并打印出售票信息。最后通过`Thread.sleep(100)`模拟售票过程,即每售出一张票就暂停100毫秒。需要注意的是,加锁之后一定要在合适的位置释放锁,否则会导致其它线程一直阻塞在锁上,无法进行下一步操作。
阅读全文