在scala中,我怎麼能告訴一個線程:sleep t seconds,或者直到收到消息?即最多t秒睡眠,但在t未結束的情況下醒來並且您收到特定消息。Scala:喚醒睡眠線程
回答
或者,您可以使用條件變量。
val monitor = new AnyRef
var messageReceived: Boolean = false
// The waiting thread...
def waitUntilMessageReceived(timeout: Int): Boolean = {
monitor synchronized {
// The time-out handling here is simplified for the purpose
// of exhibition. The "wait" may wake up spuriously for no
// apparent reason. So in practice, this would be more complicated,
// actually.
while (!messageReceived) monitor.wait(timeout * 1000L)
messageReceived
}
}
// The thread, which sends the message...
def sendMessage: Unit = monitor synchronized {
messageReceived = true
monitor.notifyAll
}
但是隨機喚醒問題應該由while(!messageReceived)而不是if(!messageReceived)來處理,不是嗎? – user1377000 2013-03-26 11:26:49
除非你別無選擇(例如,因爲性能很關鍵,必要的邏輯是非標準的),所以用手滾動這種解決方案是非常不合適的,因爲這太容易忘記。應該使用Scala和Java中的更高級別的構造。 – 2013-03-26 12:24:24
@ user1377000 - 隨機喚醒由'while'處理,但超時行爲在我的建議中會出錯:在每次喚醒後,超時將以初始值再次開始。在最糟糕的情況下,這可能會導致「永遠等待」的情況。 – Dirk 2013-03-26 12:28:41
反而使其睡眠給定的時間,使其只醒來超時()味精,然後你可以,如果你想讓它「喚醒」過早地把這個消息。
答案在很大程度上取決於什麼消息爲。如果您使用的是演員(舊版本或Akka variety),那麼您可以簡單地聲明接收時的超時值。 (陣營是不是真的運行,直到它得到一個消息,所以你不能在其上放置超時。)
// Old style
receiveWithin(1000) {
case msg: Message => // whatever
case TIMEOUT => // Handle timeout
}
// Akka style
context.setTimeoutReceive(1 second)
def receive = {
case msg: Message => // whatever
case ReceiveTimeout => // handle timeout
}
否則,究竟你的意思是「消息」?
一個簡單的方法來發送消息是使用的正是這種東西做了Java併發類。例如,你可以使用一個java.util.concurrent.SynchronousQueue
存放消息,並且接收器可以調用poll
方法,這需要超時:
// Common variable
val q = new java.util.concurrent.SynchronousQueue[String]
// Waiting thread
val msg = q.poll(1000)
// Sending thread will also block until receiver is ready to take it
q.offer("salmon", 1000)
的ArrayBlockingQueue
也是在這些情況下非常有用(如果你想發送者能夠將消息打包到緩衝區中)。
- 1. 喚醒睡眠線程
- 2. 如何喚醒睡眠(3)ing線程
- 3. 喚醒線程和退出睡眠
- 4. C# - 如何喚醒睡眠線程?
- 5. 喚醒睡眠線程,否則睡眠N秒
- 6. 睡眠和喚醒python
- 7. iPad Kiosk睡眠喚醒
- 8. 睡眠監聽器喚醒
- 9. 使用從線程喚醒睡眠主線程
- 10. 線程 - 同步和睡眠線程拒絕喚醒(LINUX)
- 11. 睡眠一個過程,並喚醒它
- 12. 如何最好地喚醒睡眠的Python線程?
- 13. 如何正常喚醒或終止睡眠std ::線程?
- 14. 使用睡眠方法喚醒Java中的線程
- 15. 使用SSE eventSource監聽器喚醒睡眠線程
- 16. 如何在Android中喚醒一個線程睡眠
- 17. 從睡眠C喚醒系統#
- 18. 睡眠.NET任務,喚醒CancellationTokenSource.Cancel()
- 19. Linux RTOS睡眠() - 喚醒()定時任務
- 20. Android深度睡眠和喚醒鎖
- 21. 喚醒處於睡眠狀態的QThread?
- 22. Time1中斷喚醒單片機睡眠
- 23. 從iPhone上的睡眠事件喚醒?
- 24. 線程調度模擬:正確的喚醒方式和睡眠線程
- 25. 如何喚醒C#.net中另一個線程的睡眠線程?
- 26. 睡眠模式下USB總線如何從機喚醒主機
- 27. 線程沒有從睡眠中醒來
- 28. 我可以通過編程從睡眠中喚醒Mac嗎?
- 29. 如何以程序喚醒睡眠如果蓋子關閉?
- 30. 如何喚醒內核中的用戶模式睡眠進程?
IIRC,有一個等待(超時超時)過載?如果是這樣,請等待某個對象,並通知()消息是否可用。 – 2013-03-26 10:49:31