生产者-消费者模式是一种常见的多线程编程模式,其中生产者线程负责生产数据,消费者线程负责消费数据。在Java中,可以使用wait()和notify()方法来实现生产者-消费者模式。
具体实现步骤如下:
- 定义一个共享的数据结构,例如一个队列。
- 定义一个生产者线程,该线程负责向队列中添加数据。在添加数据之前,需要获取队列的锁,如果队列已满,则调用wait()方法等待消费者线程消费数据。当消费者线程消费了数据后,会调用notify()方法通知生产者线程可以继续生产数据。
- 定义一个消费者线程,该线程负责从队列中消费数据。在消费数据之前,需要获取队列的锁,如果队列为空,则调用wait()方法等待生产者线程生产数据。当生产者线程生产了数据后,会调用notify()方法通知消费者线程可以继续消费数据。
示例代码如下:
import java.util.LinkedList;
public class ProducerConsumerExample {
private static final int MAX_SIZE = 10;
private LinkedList<Integer> queue = new LinkedList<>();
public void produce() throws InterruptedException {
while (true) {
synchronized (queue) {
while (queue.size() == MAX_SIZE) {
System.out.println("Queue is full, waiting for consumer to consume...");
queue.wait();
}
int value = (int) (Math.random() * 100);
System.out.println("Produced value: " + value);
queue.add(value);
queue.notifyAll();
}
Thread.sleep(1000);
}
}
public void consume() throws InterruptedException {
while (true) {
synchronized (queue) {
while (queue.isEmpty()) {
System.out.println("Queue is empty, waiting for producer to produce...");
queue.wait();
}
int value = queue.removeFirst();
System.out.println("Consumed value: " + value);
queue.notifyAll();
}
Thread.sleep(1000);
}
}
public static void main(String[] args) {
ProducerConsumerExample example = new ProducerConsumerExample();
Thread producerThread = new Thread(() -> {
try {
example.produce();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread consumerThread = new Thread(() -> {
try {
example.consume();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
producerThread.start();
consumerThread.start();
}
}
在上面的示例代码中,生产者线程和消费者线程都使用了while循环来判断队列是否已满或已空,如果是,则调用wait()方法等待对方的通知。
当生产者线程生产了数据后,会调用notifyAll()方法通知消费者线程可以继续消费数据;当消费者线程消费了数据后,会调用notifyAll()方法通知生产者线程可以继续生产数据。这样就实现了生产者-消费者模式。
网友评论