BlockingQueue问题,模拟生产者消费者,为何queue为空也可以consume呢

deer睿 2014-12-17 12:03:23

package jack;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

public class Test {
public static void main(String[] args) throws Exception {
BlockingQueue<Integer> bq = new LinkedBlockingDeque<Integer>();

Producer p = new Producer(bq);
Consumer c = new Consumer(bq);

new Thread(p).start();
new Thread(c).start();
}
}

class Producer implements Runnable {
BlockingQueue<Integer> bq;

public Producer(BlockingQueue<Integer> bq) {
this.bq = bq;
}

@Override
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (true) {
try {
bq.put(++i);
System.out.println("produce ");
Thread.sleep(1000);

} catch (Exception e) {
e.printStackTrace();
}
}
}
}

class Consumer implements Runnable {
BlockingQueue<Integer> bq;

public Consumer(BlockingQueue<Integer> bq) {
this.bq = bq;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
bq.take();
System.out.println("consume ");
Thread.sleep(3000);

} catch (Exception e) {
e.printStackTrace();
}
}
}
}


学习得不够深入,想请问下,为何有时候第一次运行结果,先consume 再 produce呢?
按我的理解,queue里没有数据,应该阻塞的呀,为何还能consume,想好久没想明白,先谢谢了~
...全文
209 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
姜小白- 2014-12-17
  • 打赏
  • 举报
回复
BlockingQueue 这个类,没怎么用过,回头看看 用一个数组来存放产品吧,然后根据是否有产品,决定是否让消费;根据数组是否已满,决定让不让继续生产。
deer睿 2014-12-17
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
consumer 的while 里面应该先判断,是否有物品可供消费,如果没有,那么wait 等待,等容器有产品可供消费时再消费。 Producer 的while 里面应该先判断,存放产品的容器是否已满,如果满了,那么wait等待,待容器有空闲时再生产产品放入。
谢谢回复。 我的理解是,BlockingQueue是阻塞队列,如果没有生成,消费者take()操作就只能阻塞。 但我写的程序里,即使没put()元素到队列里,也能够消费…… 这个不理解,是和BlockingQueue的具体实现有关吗
姜小白- 2014-12-17
  • 打赏
  • 举报
回复
consumer 的while 里面应该先判断,是否有物品可供消费,如果没有,那么wait 等待,等容器有产品可供消费时再消费。 Producer 的while 里面应该先判断,存放产品的容器是否已满,如果满了,那么wait等待,待容器有空闲时再生产产品放入。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧