Scala阻塞队列,正确等待

时间:2014-02-24 09:40:48

标签: multithreading scala queue blockingqueue

我必须在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。 有没有办法正常等待?

感谢。

1 个答案:

答案 0 :(得分:1)

感谢Voo,我得到了我需要的东西:

def waitPop() : T =
{
    this.synchronized
    {
        while(isEmpty) wait

        pop
    }
}

在推送时,我添加了notifyAll(仍在synchronized块中)。 notify也有效,但notifyAll结果似乎不太确定。

非常感谢!