用java写一个生产者消费者问题
时间: 2024-05-06 08:19:20 浏览: 11
好的,这是一个经典的多线程问题,我们可以利用 Java 的并发包来实现。
下面是一个简单的 Java 生产者消费者示例代码:
```java
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class MessageQueue {
private Queue<String> buffer = new LinkedList<>();
private int maxSize;
public MessageQueue(int size) {
this.maxSize = size;
}
public synchronized void add(String message) throws InterruptedException {
while (buffer.size() == maxSize) {
wait();
}
buffer.add(message);
System.out.println("生产者添加了一条消息:" + message);
notifyAll();
}
public synchronized String remove() throws InterruptedException {
while (buffer.isEmpty()) {
wait();
}
String message = buffer.remove();
System.out.println("消费者消费了一条消息:" + message);
notifyAll();
return message;
}
}
class Producer implements Runnable {
private MessageQueue queue;
public Producer(MessageQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
while (true) {
Random random = new Random();
int number = random.nextInt(1000);
queue.add(String.valueOf(number));
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable {
private MessageQueue queue;
public Consumer(MessageQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
while (true) {
String message = queue.remove();
Thread.sleep(2000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ProducerConsumerDemo {
public static void main(String[] args) {
MessageQueue queue = new MessageQueue(5);
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(new Producer(queue));
executor.submit(new Consumer(queue));
executor.shutdown();
}
}
```
这个示例代码创建了一个 `MessageQueue` 类来保存消息,通过 `add` 和 `remove` 方法实现生产者添加消息和消费者消费消息。我们通过 `while` 循环来等待消息队列是否已满或已空,如果满了或者空了就调用 `wait` 方法等待,直到收到通知再继续执行。
在 `Producer` 和 `Consumer` 类中,我们通过 `Runnable` 接口来实现多线程,不断地向消息队列中添加消息和从消息队列中取出消息。
在主函数中,我们创建了一个固定大小为 2 的线程池,并向线程池中提交了生产者和消费者两个任务,最后关闭线程池以释放资源。
以上就是一个简单的 Java 生产者消费者示例代码,希望能够帮助到你。