随笔-0  评论-0  文章-24  trackbacks-0
生产者指产生数据的线程,消费者指使用数据的线程。生产者必须将数据安全地交给消费者。但是运行时两者的处理速度将是最大的问题。本模式是在生产者和消费者之间加入一个渠道,该参与者用以缓冲线程间的处理速度差。一般来说可能存在多个生产者和消费者,当各只有一个时,也称为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)  编辑  收藏 所属分类: 设计模式

只有注册用户登录后才能发表评论。


网站导航: