java 多线程 BlockingQueue ???????

snailxr 2011-08-24 03:44:30
有多个线程同时往一个BlockingQueue中放数据,多个线程从这个BlockingQueue中取数据
怎么做才能保证put 或 take 之后 正确的打印出这个队列中元素的数目呢?
如下:
take线程:
while (true) {
lock.lock();
Integer i = 0;
try {
i = (Integer) queue.take();
System.out.println(this.getName() + " take " + i + " ......" + queue.size());
} catch (InterruptedException ex) {
Logger.getLogger(PutThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
}

}

put线程:
while (true) {
lock.lock();
Integer i = new Random().nextInt(10) + 1;
try {
queue.put(i);//此处应用put take 。如果用add时,成功返回true,失败则抛出异常
} catch (InterruptedException ex) {
Logger.getLogger(PutThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
}
System.out.println(this.getName() + " add " + i + " ......" + queue.size());
}


如果这两个锁是同一个的话显然是不行的。不一样的话也不可以。应该怎么办呢?
或者是要求这样的话就不能使用BlockingQueue了?????
...全文
89 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gukuitian 2011-08-24
  • 打赏
  • 举报
回复
感觉LZ的需求,用一个线程安全的队列就OK了,为什么要用阻塞队列?
izard999 2011-08-24
  • 打赏
  • 举报
回复
你这个场景我觉得不适合用阻塞队列!
阻塞队列本来就是一个线程放,一个线程去取, 你现在要的是: 你放了还不让人家去取, 要等我干完某件事后,人家才有可能去取!

如果LZ有经历写个自己的阻塞队列, 可以设置回调的那种! 释放线程之前做这个事
snailxr 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 snailxr 的回复:]
有多个线程同时往一个BlockingQueue中放数据,多个线程从这个BlockingQueue中取数据
怎么做才能保证put 或 take 之后 正确的打印出这个队列中元素的数目呢?
如下:
take线程:
Java code
while (true) {
lock.lock();
Integer i = 0;
t……
[/Quote]
不刷新带来的恶果啊,原来的有答案了。

62,614

社区成员

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

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