用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()); } }