使用java语言编写代码:两个线程模拟存票,售票过程。假设开始售票处并没有票,一个线程往里存票,另一个线程则往外卖票。新建一个票类对象,让存票和售票线程都访问它。本例采用两个线程共享一个数据对象来实现对同一份数据的操作。
时间: 2024-05-08 07:22:02 浏览: 69
以下是使用Java语言编写的代码,实现了两个线程模拟存票和售票过程:
```java
class Ticket {
private int count = 0; // 票数
// 存票方法
public synchronized void produce() {
if (count == 0) {
count++;
System.out.println(Thread.currentThread().getName() + " 存了一张票,当前票数为 " + count);
notifyAll(); // 唤醒等待线程
} else {
try {
wait(); // 等待售票线程售票
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 售票方法
public synchronized void consume() {
if (count == 0) {
try {
wait(); // 等待存票线程存票
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
count--;
System.out.println(Thread.currentThread().getName() + " 卖了一张票,当前票数为 " + count);
notifyAll(); // 唤醒等待线程
}
}
}
class Producer implements Runnable {
private Ticket ticket;
public Producer(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
ticket.produce(); // 存票
try {
Thread.sleep(1000); // 等待1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private Ticket ticket;
public Consumer(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
ticket.consume(); // 售票
try {
Thread.sleep(2000); // 等待2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Producer producer = new Producer(ticket);
Consumer consumer = new Consumer(ticket);
Thread t1 = new Thread(producer, "存票线程");
Thread t2 = new Thread(consumer, "售票线程");
t1.start();
t2.start();
}
}
```
在上面的代码中,Ticket类表示票的数量,包含了存票和售票的方法。在存票方法中,如果当前票数为0,则存入一张票,否则等待售票线程售票。在售票方法中,如果当前票数为0,则等待存票线程存票,否则卖出一张票。Producer类和Consumer类分别表示存票线程和售票线程,它们都持有一个Ticket对象,通过调用Ticket对象的produce()和consume()方法来存票和售票。在Main类中,创建一个Ticket对象和两个线程对象,分别用于存票和售票,并启动这两个线程。
阅读全文