我必须在scala中实现阻塞和同步队列。
如果我不遗漏某些内容,同步非常简单,但是为了阻止我的队列,我只能想到(有效):
def pop() : T = {
this.synchronized
{
_read()
if(_out.isEmpty) throw new Empty()
val ret = _out.head
_out = _out.tail
_length -= 1
return ret
}
}
def waitPop() : T =
{
var ret : Option[T] = None
// Possibly wait forever
while(ret.isEmpty)
{
try { ret = Some(pop) }
catch { case e : Empty => Thread.sleep(1000) }
}
ret.get
}
这里的问题是Thread.sleep
,它可能会影响性能,不是吗?
当然,设置较低的值意味着消耗更多的CPU。
有没有办法正常等待?
感谢。
答案 0 :(得分:1)
感谢Voo,我得到了我需要的东西:
def waitPop() : T =
{
this.synchronized
{
while(isEmpty) wait
pop
}
}
在推送时,我添加了notifyAll
(仍在synchronized
块中)。
notify
也有效,但notifyAll
结果似乎不太确定。
非常感谢!