我是家长,妈妈一枚,突然想写点什么(不太会写)

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推多家公司面试
[Google级团队]:实时大数据分析领域践行者
北京/深圳-大数据/搜索/机器学习职位
日志易机器大数据行业践行者Web/大数据/机器学习等职位-北京or深圳
把贵司招聘信息放这里
查看: 2532|回复: 8
收起左侧

常考题,blocking queue

[复制链接] |试试Instant~ |关注本帖
bobzhang2004 发表于 2016-2-19 15:10:57 | 显示全部楼层 |阅读模式

2016(1-3月) 码农类General 硕士 全职@Google - Other - Onsite  | Other | 其他

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
google, uber都有考blocking queue, 我在网上找了个代码,但感觉有点问题,为什么是先notify,然后再加入呢?这样不是无法生效吗?因为notify后检查结果还是空或者还是满的?请大神指点。
  1. public class BlockingQueue {

  2.         private List queue = new LinkedList();
  3.         private int limit = 10;

  4.         public BlockingQueue(int limit) {. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  5.                 this.limit = limit;
    . more info on 1point3acres.com
  6.         }
  7. -google 1point3acres
  8.         public synchronized void enqueue(Object item) throws InterruptedException {. visit 1point3acres.com for more.
  9.                 while (this.queue.size() == this.limit) {
  10.                         wait();
  11.                 }
  12.                 if (this.queue.size() == 0) {
  13.                         notifyAll();
  14.                 }
  15.                 this.queue.add(item);  //I think this is wrong
  16.         }. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷

  17.         public synchronized Object dequeue() throws InterruptedException {
  18.                 while (this.queue.size() == 0) {
  19.                         wait();
  20.                 }
  21.                 if (this.queue.size() == this.limit) {
  22.                         notifyAll();
  23.                 }
  24.                 return this.queue.remove(0);
  25.         }. From 1point 3acres bbs
  26. }
复制代码
beefcurtain5 发表于 2016-2-19 16:27:41 | 显示全部楼层
小弟们, java 是个open source language, 网上有的查java class的source code。。。 just google “grepcode BlockingQueue”
回复 支持 反对

使用道具 举报

lotustree86 发表于 2016-2-19 16:59:08 | 显示全部楼层
在这里是无所谓的,因为只要你没有从synchronized 函数中返回,你还是持有lock的,其它waiting thread是不会被wake up的,notify 只是把waiting thread从waiting queue放到ready queue,要真正wake up需要拿到lock才行。
回复 支持 反对

使用道具 举报

 楼主| bobzhang2004 发表于 2016-2-19 23:00:21 | 显示全部楼层
lotustree86 发表于 2016-2-19 16:59. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
在这里是无所谓的,因为只要你没有从synchronized 函数中返回,你还是持有lock的,其它waiting thread是不 ...

这里如果wake up以后,queue还没有加入元素,那样wake up的线程又会被block吧,因为还在while循环中,是不是应该先加元素,最后notifyAll呢?
回复 支持 反对

使用道具 举报

lotustree86 发表于 2016-2-20 09:05:07 | 显示全部楼层
bobzhang2004 发表于 2016-2-19 23:00
这里如果wake up以后,queue还没有加入元素,那样wake up的线程又会被block吧,因为还在while循环中,是 ...

嗯, 不好意思,我前面的回复是错的。应该是在加入新的元素后,然后再notify.
回复 支持 反对

使用道具 举报

xiaoniqiuqiu 发表于 2016-3-5 15:35:31 | 显示全部楼层
我有个地方不太明白哈,求问一下。. From 1point 3acres bbs
if (this.queue.size() == 0) {
     notifyAll();. From 1point 3acres bbs
}
为什么是空的时候notify all呢?
不是空的时候就不notify all嘛?
回复 支持 反对

使用道具 举报

 楼主| bobzhang2004 发表于 2016-3-5 23:50:58 | 显示全部楼层
xiaoniqiuqiu 发表于 2016-3-5 15:35
我有个地方不太明白哈,求问一下。
if (this.queue.size() == 0) {
     notifyAll();
. From 1point 3acres bbs
因为要唤醒要dequeue的线程
回复 支持 反对

使用道具 举报

xiaoniqiuqiu 发表于 2016-3-6 16:14:46 | 显示全部楼层
bobzhang2004 发表于 2016-3-5 23:50. 鍥磋鎴戜滑@1point 3 acres
因为要唤醒要dequeue的线程

queue是空的时候唤醒dequeue的线程?
回复 支持 反对

使用道具 举报

newbiee 发表于 2016-4-11 11:12:18 | 显示全部楼层
恩,我感觉逻辑是有点问题,producer自己notifyAll() 自己, 我找了个代码,好像更加合理一些  http://stackoverflow.com/a/2537117/3288836
回复 支持 反对

使用道具 举报

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2018-4-24 06:59

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表