读书人

用blocking queue兑现生产者消费者

发布时间: 2012-12-19 14:13:14 作者: rapoo

用blocking queue实现生产者消费者
就前一篇的类似操作,也是看到一篇面试题,练习了一下用blockingQueue;
似乎我感觉有点儿问题,但是不知道在哪儿,当局者迷,欢迎指正,谢谢

/*
ArrayBlockingQueue<Product0>(1);
为何会出现:同时两个空间的容量呢
生产者 1号[4--呵呵]
生产者 1号[5--呵呵]
消费者 1号[4--呵呵]
消费者 1号[5--呵呵]
生产者 1号[6--呵呵]
消费者 1号[6--呵呵]
*/

package com.pdsu.zhang.thread;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;public class Pro_Cus_BlockingQueue {/** * @param args * @author zhangli * @throws InterruptedException  */public static void main(String[] args) throws InterruptedException {BlockingQueue<Product0> q = new ArrayBlockingQueue<Product0>(1);     Producer0 p = new Producer0(q);     Consumer c1 = new Consumer(q);     Consumer c2 = new Consumer(q);     new Thread(p,"生产者 1号").start();     new Thread(c1,"消费者 1号").start();     new Thread(c2,"消费者 2号").start();}}class Product0 { //产品private int ID;private String name;public Product0(int id, String name) {ID = id;this.name = name;}@Overridepublic String toString() {return  "["+ID+"--"+name+"]";}}class Producer0 implements Runnable {   private final BlockingQueue<Product0> queue;   Producer0(BlockingQueue<Product0> q) { queue = q; }   Product0 temp;   int id=0;   public void run() {     try {       while(true) {          Thread.sleep(500);       temp= produce();       queue.put(temp);        System.out.println(Thread.currentThread().getName()+temp.toString());           }     } catch (InterruptedException ex) { ex.printStackTrace();}   }   Product0 produce() { return new Product0(id++,"呵呵");} }class Consumer implements Runnable {   private final BlockingQueue<Product0> queue;   Consumer(BlockingQueue<Product0> q) { queue = q; }   public void run() {     try {       while(true) {       Thread.sleep(1000);       consume(queue.take());         }     } catch (InterruptedException ex) { ex.printStackTrace();}   }   void consume(Product0 x) { System.out.println(Thread.currentThread().getName()+x.toString()); } }

读书人网 >编程

热点推荐