生产者与消费者模式

一. 常见的生产者与消费者模式的实现

队列代码:

public class TestQueue {
    public static Object signal=new Object();  
        boolean bFull=false;   
        private List thingsList=new ArrayList();   
        private final ReentrantLock lock = new ReentrantLock(true);  
        BlockingQueue q = new ArrayBlockingQueue(10);  
        /** 
         * 生产 
         * @param thing 
         * @throws Exception 
         */  
        public void product(String thing) throws Exception{   
            synchronized(signal){  
                if(!bFull){  
                    bFull=true;  
                      //产生一些东西,放到 thingsList 共享资源中  
                    System.out.println("product");  
                    System.out.println("仓库已满,正等待消费...");   
                    thingsList.add(thing);   
                    signal.notify(); //然后通知消费者  
                }            
                signal.wait(); // 然后自己进入signal待召队列  

            }  

        }  

        /** 
         * 消费 
         * @return 
         * @throws Exception 
         */  
        public String consumer()throws Exception{             
            synchronized(signal){  //采用synchronized进行同步
                if(!bFull)  {    
                         signal.wait(); // 进入signal待召队列,等待生产者的通知  
                }  
                bFull=false;   
                // 读取buf 共享资源里面的东西  
                System.out.println("consume");  
                System.out.println("仓库已空,正等待生产...");   
                signal.notify(); // 然后通知生产者  
            }  
            String result="";  
            if(thingsList.size()>0){  
                result=thingsList.get(thingsList.size()-1).toString();  
                thingsList.remove(thingsList.size()-1);  
            }  
            return result;  
        }  
    }

生产者代码:

public class TestProduct implements Runnable {  

    TestQueue obj;  

    public TestProduct(TestQueue tq){  
        this.obj=tq;  
    }  

    public void run() {  
        for(int i=0;i<10;i++){  
            try {  
                obj.product("test"+i);  
            } catch (Exception e) {               
                e.printStackTrace();  
            }  
        }  
    }  

}  

消费者代码:

public class TestConsumer implements Runnable {  

    TestQueue obj;  

    public TestConsumer(TestQueue tq){  
        this.obj=tq;  
    }  

    public void run() {               
        try {  
            for(int i=0;i<10;i++){  
                obj.consumer();  
            }             
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

测试代码:

public class TestMain {  
    public static void main(String[] args) throws Exception{  
        TestQueue tq=new TestQueue();  
        TestProduct tp=new TestProduct(tq);  
        TestConsumer tc=new TestConsumer(tq);  
        Thread t1=new Thread(tp);  
        Thread t2=new Thread(tc);  
        t1.start();  
        t2.start();  
    }  
}  

二、阻塞队列实现生产者与消费者模式

     public class Producer implements Runnable {  //生产者
        private final BlockingQueue queue;  
        Producer(BlockingQueue q) { queue = q; }  
        public void run() {  
          try {  
            while(true) { queue.put(produce()); }  
          } catch (InterruptedException ex) { ... handle ...}  
        }  
        Object produce() { ... }  
      }  

      public class Consumer implements Runnable {  //消费者
        private final BlockingQueue queue;  
        Consumer(BlockingQueue q) { queue = q; }  
        public void run() {  
          try {  
            while(true) { consume(queue.take()); }  
          } catch (InterruptedException ex) { ... handle ...}  
        }  
        void consume(Object x) { ... }  
      }  

     public class Setup {  
        void main() {  
          BlockingQueue q = new SomeQueueImplementation();  
          Producer p = new Producer(q);  
          Consumer c1 = new Consumer(q);  
          Consumer c2 = new Consumer(q);  
          new Thread(p).start();  
          new Thread(c1).start();  
          new Thread(c2).start();  
        }  
     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值