先说下同步原语。
我们假设有两个信号量full(表示slots中有货),empty(表示slots中有空闲)
生产者:
producer: wait(empty) mutex_lock put an item mutex_unlock signal(full)
消费者:
consumer: wait(full) mutex_lock get an item mutex_unlock signal(empty)
上述同步原语很古董了,Java中很难有这些直接的翻译方法(pthread_mutext还是有的)。
Java中实现生产者、消费者模型有N多方法,本文主要介绍如下几种:
1、synchronized同步对象,下述代码只适合单生产者、单消费者。
import java.util.LinkedList;
class Producer implements Runnable {
public Producer(LinkedList<Integer> slots) {
this.slots = slots;
}
public void run() {
while (true) {
synchronized (slots) {
try {
// wait(empty)
while (slots.size() >= PCV1.MAX) {
slots.wait();
}
// put
if (slots.add(new Integer(cnt))) {
System.out.println("Producer : " + cnt);
cnt++;
slots.notify();
}
} catch (Exception e) {
}
}
}
}
private LinkedList<Integer> slots = null;
private int cnt = 0;
}
class Consumer implements Runnable {
public Consumer(LinkedList<Integer> slots) {
this.slots = slots;
}
public void run() {
while (true) {
synchronized (slots) {
try {
// wait(full)
while (slots.size() == 0) {
slots.wait();
}
// get
System.out.println("Consumer : " + slots.removeFirst());
slots.notify();
} catch (Exception e) {
}
}
}
}
private LinkedList<Integer> slots = null;
}
public class PCV1 {
public static final int MAX = 10;
public static void main(String[] args) {
LinkedList<Integer> slots = new LinkedList<Integer>();
Thread t1 = new Thread(new Producer(slots));
Thread t2 = new Thread(new Consumer(slots));
try {
t1.start();
t2.start();
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}