用java编写程序实现用两个线程模拟存票、售票过程。 假定开始售票处并没有票,一个线程往里存票,另外一个线程则往外卖票 新建一个票类对象,让存票和售票线程都访问它。本例采用两个线程共享同一个数据对象来实现对同一份数据的操作
时间: 2023-12-29 08:08:50 浏览: 101
好的,我来回答你的问题。
这是一个经典的多线程编程问题,可以通过使用Java的synchronized关键字实现线程同步。下面是一个简单的代码示例:
```java
public class Ticket {
private int count = 0;
public synchronized void sellTicket() {
while (count == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
System.out.println(Thread.currentThread().getName() + " 卖出一张票,还剩 " + count + " 张票");
notifyAll();
}
public synchronized void storeTicket() {
while (count > 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println(Thread.currentThread().getName() + " 存入一张票,现在有 " + count + " 张票");
notifyAll();
}
}
public class SellTicketThread implements Runnable {
private Ticket ticket;
public SellTicketThread(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
ticket.sellTicket();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class StoreTicketThread implements Runnable {
private Ticket ticket;
public StoreTicketThread(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
ticket.storeTicket();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(new SellTicketThread(ticket), "售票员").start();
new Thread(new StoreTicketThread(ticket), "存票员").start();
}
}
```
在这段代码中,Ticket类表示票的数量,包含了两个方法sellTicket和storeTicket,分别用于卖票和存票。这两个方法都使用了synchronized关键字,确保了线程同步。
SellTicketThread和StoreTicketThread类分别表示售票员和存票员。它们都持有一个Ticket对象,并在run方法中不断地调用对应的方法。
Main类用于创建线程并启动。
这段代码使用了wait和notifyAll方法,实现了线程间的通信。当票的数量为0时,售票员会调用wait方法,进入等待状态;当票的数量不为0时,存票员会调用notifyAll方法,唤醒所有等待的线程。
希望这个例子能够帮助你理解多线程编程。
阅读全文