1

在scala中,我怎么能告诉一个线程:sleep t seconds,或者直到你收到一条消息?即最多睡眠 t 秒,但在 t 未结束且您收到特定消息时醒来。

4

4 回答 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

查看等待。如果您有一些Awaitable对象,那么这就是您所需要的。

于 2013-03-26T10:53:21.663 回答
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 回答