24. 写出生产者消费者模式

2016/10/1 14:31 下午 posted in  Java comments

参照网络上的资料,自己写了一个生产者消费者模式。

package com.cd.test;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Main {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        
        Container container = new Container();
        
        Producer a = new Producer(container, "Wang Sir");
        Producer b = new Producer(container, "Li Sir");
        Consumer c = new Consumer(container, "Chen");
        Consumer d = new Consumer(container, "Opp");
        Consumer e = new Consumer(container, "Satoshi");
        
        service.submit(a);
        service.submit(b);
        service.submit(c);
        service.submit(d);
        service.submit(e);
    }

}

class Goods {
    int no;
    String producer;
    
    Goods(int no, String producer){
        this.no = no;
        this.producer = producer;
    }
    
    public String toString(){
        return "product :" + no + " by " + this.producer;
    }
}

class Container {
    BlockingQueue<Goods> queue = null;
    int index = 0;
    int max = 0;
    
    Container(int num){
        if(num > 0){
            queue = new ArrayBlockingQueue<Goods>(num);
            max = num;
        }
        else{
            queue = new ArrayBlockingQueue<Goods>(10);
            max = 10;
        }
    }

    Container(){
        this(10);
    }
    
    synchronized public Goods pop() throws InterruptedException{
        if(queue == null || queue.isEmpty())
            return null;
        
        Goods tmp = queue.take();
        
        return tmp;
    }
    
    synchronized public boolean push(Goods good) throws InterruptedException{
        if(queue == null || queue.size() == max)
            return false;
        
        queue.put(good);
        
        return true;
    }
}

class Producer implements Runnable{
    Container container = null;
    String producer = null;
    
    Producer(Container ct, String producer){
        this.container = ct;
        this.producer = producer;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        int index = 0;
        
        while(index < 5){
            Goods good = new Goods(index++, this.producer);
            
            try {
                container.push(good);
                System.out.println(" Produced goods :" + good.toString());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
}

class Consumer implements Runnable{
    Container container = null;
    String producer = null;
    
    Consumer(Container ct, String producer){
        this.container = ct;
        this.producer = producer;
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            Goods good;
            
            try {
                good = container.pop();
                
                System.out.println(" Consumed goods :" + good.toString());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    
}

其中一次的运行结果

 Produced goods :product :0 by Wang Sir
 Produced goods :product :1 by Wang Sir
 Produced goods :product :2 by Wang Sir
 Produced goods :product :3 by Wang Sir
 Produced goods :product :4 by Wang Sir
 Produced goods :product :0 by Li Sir
 Produced goods :product :1 by Li Sir
 Consumed goods :product :0 by Wang Sir
 Consumed goods :product :0 by Li Sir
 Consumed goods :product :1 by Wang Sir
 Consumed goods :product :2 by Wang Sir
 Consumed goods :product :3 by Wang Sir
 Consumed goods :product :4 by Wang Sir
 Produced goods :product :2 by Li Sir
 Consumed goods :product :1 by Li Sir
 Consumed goods :product :2 by Li Sir
 Produced goods :product :3 by Li Sir
 Consumed goods :product :3 by Li Sir
 Produced goods :product :4 by Li Sir
 Consumed goods :product :4 by Li Sir