生产者指产生数据的线程,消费者指使用数据的线程。生产者必须将数据安全地交给消费者。但是运行时两者的处理速度将是最大的问题。本模式是在生产者和消费者之间加入一个渠道,该参与者用以缓冲线程间的处理速度差。一般来说可能存在多个生产者和消费者,当各只有一个时,也称为Pipe模式。
渠道
class Channel {
private final String[] buffer;
private int tail;
private int head;
private int count;
public Channel(int size) {
this.buffer = new String[size];
this.head = 0;
this.tail = 0;
this.count = 0;
}
public synchronized void put(String data) throws InterruptedException {
while (count >= buffer.length)
wait();
buffer[tail] = data;
tail = (tail + 1) % buffer.length;
count++;
System.out.print(Thread.currentThread().getName() + " puts " + data);
showChannel();
notifyAll();
}
public synchronized String take() throws InterruptedException {
while (count <= 0)
wait();
String data = buffer[head];
buffer[head] = null;
head = (head + 1) % buffer.length;
count--;
System.out.print(Thread.currentThread().getName() + " takes " + data);
showChannel();
notifyAll();
return data;
}
private void showChannel() {
System.out.print(" Channel:");
for (String data : buffer) {
System.out.print(data + " ");
}
System.out.println();
}
}
生产者
class Producer extends Thread {
private final Channel channel;
private static int id = 0;
private final Random random;
public Producer(String name, Channel channel, long seed) {
super(name);
this.channel = channel;
this.random = new Random(seed);
}
@Override
public void run() {
try {
while (true) {
Thread.sleep(random.nextInt(1000));
String data = "[Data No." + nextId() + " by " + getName() + "]";
channel.put(data);
}
} catch (InterruptedException e) {
}
}
private static synchronized int nextId() {
return id++;
}
}
消费者
class Consumer extends Thread {
private final Channel channel;
private final Random random;
public Consumer(String name, Channel channel, long seed) {
super(name);
this.channel = channel;
this.random = new Random(seed);
}
@Override
public void run() {
try {
while (true) {
String data = channel.take();
Thread.sleep(random.nextInt(1000));
}
} catch (InterruptedException e) {
}
}
}
测试类
public class Main {
public static void main(String[] args) {
Channel channel = new Channel(3);
new Producer("Producer-1", channel, 48395).start();
new Producer("Producer-2", channel, 78749).start();
new Producer("Producer-3", channel, 90759).start();
new Consumer("Consumer-1", channel, 84395).start();
new Consumer("Consumer-2", channel, 10394).start();
new Consumer("Consumer-3", channel, 39486).start();
}
}
测试结果
Producer-1 puts [Data No.0 by Producer-1] Channel:[Data No.0 by Producer-1] null null
Consumer-2 takes [Data No.0 by Producer-1] Channel:null null null
Producer-3 puts [Data No.1 by Producer-3] Channel:null [Data No.1 by Producer-3] null
Consumer-1 takes [Data No.1 by Producer-3] Channel:null null null
Producer-2 puts [Data No.2 by Producer-2] Channel:null null [Data No.2 by Producer-2]
Consumer-2 takes [Data No.2 by Producer-2] Channel:null null null
Producer-3 puts [Data No.3 by Producer-3] Channel:[Data No.3 by Producer-3] null null
Consumer-3 takes [Data No.3 by Producer-3] Channel:null null null
Producer-1 puts [Data No.4 by Producer-1] Channel:null [Data No.4 by Producer-1] null
Consumer-1 takes [Data No.4 by Producer-1] Channel:null null null
Producer-2 puts [Data No.5 by Producer-2] Channel:null null [Data No.5 by Producer-2]
Consumer-2 takes [Data No.5 by Producer-2] Channel:null null null
Producer-2 puts [Data No.6 by Producer-2] Channel:[Data No.6 by Producer-2] null null
Producer-2 puts [Data No.7 by Producer-2] Channel:[Data No.6 by Producer-2] [Data No.7 by Producer-2] null
Producer-1 puts [Data No.8 by Producer-1] Channel:[Data No.6 by Producer-2] [Data No.7 by Producer-2] [Data No.8 by Producer-1]
Consumer-3 takes [Data No.6 by Producer-2] Channel:null [Data No.7 by Producer-2] [Data No.8 by Producer-1]
Producer-2 puts [Data No.9 by Producer-2] Channel:[Data No.9 by Producer-2] [Data No.7 by Producer-2] [Data No.8 by Producer-1]
Consumer-1 takes [Data No.7 by Producer-2] Channel:[Data No.9 by Producer-2] null [Data No.8 by Producer-1]
Producer-3 puts [Data No.10 by Producer-3] Channel:[Data No.9 by Producer-2] [Data No.10 by Producer-3] [Data No.8 by Producer-1]
Consumer-2 takes [Data No.8 by Producer-1] Channel:[Data No.9 by Producer-2] [Data No.10 by Producer-3] null
Producer-2 puts [Data No.11 by Producer-2] Channel:[Data No.9 by Producer-2] [Data No.10 by Producer-3] [Data No.11 by Producer-2]
Consumer-1 takes [Data No.9 by Producer-2] Channel:null [Data No.10 by Producer-3] [Data No.11 by Producer-2]
Producer-1 puts [Data No.12 by Producer-1] Channel:[Data No.12 by Producer-1] [Data No.10 by Producer-3] [Data No.11 by Producer-2]
Consumer-3 takes [Data No.10 by Producer-3] Channel:[Data No.12 by Producer-1] null [Data No.11 by Producer-2]
Producer-3 puts [Data No.13 by Producer-3] Channel:[Data No.12 by Producer-1] [Data No.13 by Producer-3] [Data No.11 by Producer-2]
Consumer-1 takes [Data No.11 by Producer-2] Channel:[Data No.12 by Producer-1] [Data No.13 by Producer-3] null
。。。。。。
此处下载源代码
posted on 2009-06-04 12:35
chenkkkabc 阅读(414)
评论(0) 编辑 收藏 所属分类:
设计模式