1

Scalaで、スレッドにどのように伝えることができますか:t秒間スリープするか、メッセージを受信するまでスリープしますか?つまり、最大でt秒スリープしますが、tが終了しておらず、特定のメッセージを受信した場合に備えてウェイクアップします。

4

4 に答える 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

Awaitをチェックしてください。待機可能なオブジェクトがある場合は、それが必要です。

于 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 に答える