生产者-消费者问题是一个经典的并发编程问题,涉及到多个线程共享资源的同步与互斥。使用Java的wait和notify机制可以有效地解决这个问题。
接下来笔者就用具体的Java代码实现的简单生产者-消费者问题解决方案:
import java.util.LinkedList;
class SharedResource {
private LinkedList<Integer> buffer = new LinkedList<>();
private int capacity = 5;
public synchronized void produce() throws InterruptedException {
while (buffer.size() == capacity) {
wait(); // 等待,直到缓冲区不满
}
int item = (int) (Math.random() * 100);
buffer.add(item);
System.out.println("Produced: " + item);
notifyAll(); // 唤醒等待的消费者线程
}
public synchronized void consume() throws InterruptedException {
while (buffer.size() == 0) {
wait(); // 等待,直到缓冲区不空
}
int item = buffer.removeFirst();
System.out.println("Consumed: " + item);
notifyAll(); // 唤醒等待的生产者线程
}
}
class Producer implements Runnable {
private SharedResource sharedResource;
public Producer(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
try {
while (true) {
sharedResource.produce();
Thread.sleep(1000); // 模拟生产时间
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable {
private SharedResource sharedResource;
public Consumer(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
try {
while (true) {
sharedResource.consume();
Thread.sleep(1500); // 模拟消费时间
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
Thread producerThread = new Thread(new Producer(sharedResource));
Thread consumerThread = new Thread(new Consumer(sharedResource));
producerThread.start();
consumerThread.start();
}
}
在这个例子中,SharedResource类表示共享的缓冲区,其中的produce和consume方法分别用于生产和消费数据。Producer和Consumer类分别表示生产者和消费者线程,它们通过调用SharedResource的方法来生产和消费数据。使用wait和notifyAll方法来实现线程之间的同步与互斥,确保在正确的时机唤醒等待的线程。
需要注意的是,这只是一个简单的示例,实际生产环境中可能需要更复杂的逻辑和错误处理。同时,Java 5及之后的版本提供了更高级的并发工具,如BlockingQueue和ExecutorService,可以更方便地解决生产者-消费者问题。