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
результат кажется менее детерминированным.
Большое спасибо!