在scala中,我怎么能告诉一个线程:sleep t seconds,或者直到你收到一条消息?即最多睡眠 t 秒,但在 t 未结束且您收到特定消息时醒来。
问问题
705 次
4 回答
3
答案很大程度上取决于信息是什么。如果您正在使用 Actors(旧变体或Akka 变体),那么您可以简单地在接收时声明一个超时值。(在收到消息之前,React 并没有真正运行,因此您不能对其设置超时。)
// 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 并发类。例如,您可以使用 ajava.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)
AnArrayBlockingQueue
在这些情况下也很有用(如果您希望发送者能够将消息打包在缓冲区中)。
于 2013-03-26T12:19:34.040 回答
1
或者,您可以使用条件变量。
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
}
于 2013-03-26T10:56:29.053 回答
0
与其让它在给定的时间内休眠,不如让它只在 Timeout() 消息时唤醒,然后如果您希望它“唤醒”,您可以提前发送此消息。
于 2013-03-26T10:46:05.667 回答