编写一个JAVA程序,要求实现一个卖票功能。(一共有100张票,两个线程共同卖这100张票,每过一秒会卖出一张票,然后打印当前剩余票数,卖至0张时停止售卖。)
时间: 2024-10-16 15:15:17 浏览: 23
在Java中,我们可以使用synchronized关键字和wait/notify机制来实现线程安全的卖票功能。这里是一个简单的示例:
```java
import java.util.concurrent.atomic.AtomicInteger;
class Ticket {
private AtomicInteger ticketCount = new AtomicInteger(100);
private Object lock = new Object();
public synchronized void sellTicket() throws InterruptedException {
if (ticketCount.get() > 0) {
System.out.println("第" + ticketCount.incrementAndGet() + "张票售出,剩余:" + ticketCount.get());
// 使用锁等待,直到下秒再检查票是否售完
wait(1000);
} else {
notifyAll(); // 当票全部售完,唤醒其他等待的线程
return;
}
}
}
public class TicketSaleThread extends Thread {
private Ticket ticket;
public TicketSaleThread(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
try {
ticket.sellTicket();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread thread1 = new TicketSaleThread(ticket);
Thread thread2 = new TicketSaleThread(ticket);
thread1.start();
thread2.start();
// 等待所有票售完
while (ticket.ticketCount.get() != 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("票已售完,停止售卖");
}
}
```
在这个示例中,我们创建了一个`Ticket`类,它有一个原子整型变量记录票的数量以及一个锁对象。`sellTicket()`方法是同步的,确保了任何时候只有一个线程能修改票的数量。当票售完时,主线程会打印消息并停止线程。
每个`TicketSaleThread`实例会无限循环地尝试购买票,如果票已售完则进入等待状态。当主线程检测到票数为0时,它会唤醒所有等待的线程。
阅读全文