Scalaで、スレッドにどのように伝えることができますか:t秒間スリープするか、メッセージを受信するまでスリープしますか?つまり、最大でt秒スリープしますが、tが終了しておらず、特定のメッセージを受信した場合に備えてウェイクアップします。
質問する
705 次
4 に答える
3
答えは、メッセージが何であるかによって大きく異なります。アクター(古い品種または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
}
そうでなければ、「メッセージ」とは正確にはどういう意味ですか?
メッセージを送信する簡単な方法の1つは、まさにこの種のもののために作成された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)
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 に答える