Scala блокирует очередь, заставляя ждать

Я должен реализовать блокировку и синхронизированную очередь в 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, это может поставить под угрозу производительность, не так ли? Конечно, установка более низкого значения будет означать использование большего количества ресурсов процессора. Есть ли способ ждать правильно?

Благодарю.

1 ответ

Решение

Благодаря Во, я получил то, что мне было нужно:

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

        pop
    }
}

Находясь в толчке, я добавил notifyAll (все еще в synchronized блок).notify также работал, но с notifyAll результат кажется менее детерминированным.

Большое спасибо!

Другие вопросы по тегам