2014-02-24 173 views
2

我必須在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,它可以妥協表現,不是嗎? 當然,設置一個較低的值意味着消耗更多的CPU。 有沒有辦法等待正確?

謝謝。

+0

我看了一下https://stackoverflow.com/questions/1107593/what-are-trade-offs-for-busy-wait-vs-sleep 但是,就我而言,調度程序不知道我在等什麼呢? –

+1

你想使用'Object.wait'和'Object.notify'。 – Voo

+0

謝謝,這就是我正在尋找的東西(我對所有這些未來和所有人都很難過)。 非常感謝! –

回答

1

感謝VOO,我得到了我需要的東西:

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

     pop 
    } 
} 

而在推,我(在​​塊仍然)加入notifyAllnotify也在工作,但與notifyAll結果似乎不太確定。

非常感謝!

+0

如果因爲限制棧的大小而阻塞'push',那麼你需要'notifyAll',否則'notify'應該更有效一些,否則你會喚醒所有線程,儘管只有一個線程可以工作。 「notfiy」並沒有給出任何公平的保證,儘管如此,在某些情況下可能有用。 – Voo

+0

我還補充了這一點,因爲我必須通過'notify'來使某些東西不太可能確定(無所謂爲什麼我猜),我得到了我所有的線程以同樣的順序從隊列中獲取了一個元素, 。 –