使用java语言解决生产者消费者问题
时间: 2023-10-07 11:14:13 浏览: 96
下面是使用 Java 语言解决生产者消费者问题的示例代码:
```java
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
public class ProducerConsumerProblem {
public static void main(String[] args) {
Queue<Integer> buffer = new LinkedList<>();
int maxSize = 5;
Thread producer = new Thread(new Producer(buffer, maxSize));
Thread consumer = new Thread(new Consumer(buffer, maxSize));
producer.start();
consumer.start();
}
static class Producer implements Runnable {
private Queue<Integer> buffer;
private int maxSize;
public Producer(Queue<Integer> buffer, int maxSize) {
this.buffer = buffer;
this.maxSize = maxSize;
}
@Override
public void run() {
while (true) {
synchronized (buffer) {
while (buffer.size() == maxSize) {
try {
System.out.println("Buffer is full, waiting for consumer...");
buffer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Random random = new Random();
int num = random.nextInt(100);
System.out.println("Producing " + num);
buffer.add(num);
buffer.notifyAll();
}
}
}
}
static class Consumer implements Runnable {
private Queue<Integer> buffer;
private int maxSize;
public Consumer(Queue<Integer> buffer, int maxSize) {
this.buffer = buffer;
this.maxSize = maxSize;
}
@Override
public void run() {
while (true) {
synchronized (buffer) {
while (buffer.isEmpty()) {
try {
System.out.println("Buffer is empty, waiting for producer...");
buffer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int num = buffer.poll();
System.out.println("Consuming " + num);
buffer.notifyAll();
}
}
}
}
}
```
在这个示例代码中,我们使用了一个队列(LinkedList)来作为共享缓冲区,生产者和消费者通过对该队列进行操作来实现产品的生产和消费。使用了两个线程 Producer 和 Consumer 来分别实现生产者和消费者的功能。在 Producer 中,我们使用了 while 循环来不断地生产产品,当缓冲区已满时,使用 wait 方法来等待消费者消费产品。在 Consumer 中,我们同样使用了 while 循环来不断地消费产品,当缓冲区为空时,使用 wait 方法来等待生产者生产产品。在生产和消费产品的过程中,我们使用了 synchronized 来实现对共享缓冲区的访问同步。同时,我们使用了 notifyAll 方法来通知等待中的线程,以便它们能够及时地获取到共享资源进行操作。
这样,我们就使用 Java 语言解决了生产者消费者问题。
阅读全文