生产者消费者问题java
时间: 2023-10-14 12:23:16 浏览: 30
生产者消费者问题是一个经典的多线程同步问题,在Java中可以使用synchronized关键字和wait()/notify()方法来实现。
以下是一个简单的Java代码示例,实现了一个生产者消费者模型:
```java
class Buffer {
private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
wait();
} catch (InterruptedException e) {
}
}
available = false;
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
wait();
} catch (InterruptedException e) {
}
}
contents = value;
available = true;
notifyAll();
}
}
class Producer extends Thread {
private Buffer buffer;
public Producer(Buffer buffer) {
this.buffer = buffer;
}
public void run() {
for (int i = 0; i < 10; i++) {
buffer.put(i);
System.out.println("Producer put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) {
}
}
}
}
class Consumer extends Thread {
private Buffer buffer;
public Consumer(Buffer buffer) {
this.buffer = buffer;
}
public void run() {
int value;
for (int i = 0; i < 10; i++) {
value = buffer.get();
System.out.println("Consumer get: " + value);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) {
}
}
}
}
public class ProducerConsumerTest {
public static void main(String[] args) {
Buffer buffer = new Buffer();
Producer producer = new Producer(buffer);
Consumer consumer = new Consumer(buffer);
producer.start();
consumer.start();
}
}
```
在上面的代码中,Buffer类表示缓冲区,Producer类和Consumer类分别表示生产者和消费者。通过wait()和notifyAll()方法来实现线程之间的同步。当缓冲区为空时,消费者线程调用wait()方法进入等待状态,直到生产者线程往缓冲区放入数据并调用notifyAll()方法唤醒消费者线程。当缓冲区已满时,生产者线程调用wait()方法进入等待状态,直到消费者线程从缓冲区取出数据并调用notifyAll()方法唤醒生产者线程。