生产者与消费者是java并发环境下常见的设计模式,一个线程负责生产数据,一个线程负责消费数据。
package com.example;
import java.util.LinkedList;
import java.util.Queue;
/**
* 生产者和消费者模型
*
* @author tom
*/
public class ProducerConsumerExample {
public static void main(String[] args) {
Queue<Integer> buffer = new LinkedList<>();
int maxSize = 10;
Thread producerThread = new Thread(new Producer(buffer, maxSize));
Thread consumerThread = new Thread(new Consumer(buffer));
producerThread.start();
consumerThread.start();
}
}
class Producer implements Runnable {
private final Queue<Integer> buffer;
private final 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 {
buffer.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
int data = (int) (Math.random() * 100);
buffer.add(data);
System.out.println("生产者生产数据: " + data);
buffer.notifyAll();
}
}
}
}
class Consumer implements Runnable {
private final Queue<Integer> buffer;
public Consumer(Queue<Integer> buffer) {
this.buffer = buffer;
}
@Override
public void run() {
while (true) {
synchronized (buffer) {
while (buffer.isEmpty()) {
try {
buffer.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
int data = buffer.poll();
System.out.println("消费者消费数据: " + data);
buffer.notifyAll();
}
}
}
}
# 输出
生产数据: 4
生产者生产数据: 1
生产者生产数据: 5
生产者生产数据: 92
生产者生产数据: 81
消费者消费数据: 33
消费者消费数据: 72
消费者消费数据: 59
消费者消费数据: 41
消费者消费数据: 63
消费者消费数据: 4
消费者消费数据: 1
消费者消费数据: 5
消费者消费数据: 92
消费者消费数据: 81
生产者生产数据: 16
......