Даниэль дал лучший ответ на часть вопроса об условии отсутствия ввода. Итак, я отредактировал свое низшее решение.
Что касается части вопроса с отложенным ответом, очередь сообщений не блокируется, пока актер спит. Он может просто спать, а сообщения все равно будут накапливаться.
Однако, если вы хотите установить фиксированную задержку с момента получения сообщения до момента его обработки, вы можете, например, создать актера, который будет работать немедленно, но обернет сообщение в запрос на задержку:
case class Delay(when: Long, what: Any) { }
// Inside class DelayingActor(workingActor: Actor)
case msg => workingActor ! Delay(delayValue + System.currentTimeMillis , msg)
Тогда рабочий актер
case Delay(t,msg) =>
val t0 = System.currentTimeMillis
if (t>t0) Thread.sleep( t - t0 )
msg match {
// Handle message
}