В первом ответе был Эрланг, но он, похоже, исчез. Вы можете легко сделать тот же трюк в стиле Эрланга с актерами Scala. Например. давайте создадим планировщик, который не использует потоки:
import actors.{Actor,TIMEOUT}
def scheduler(time: Long)(f: => Unit) = {
def fixedRateLoop {
Actor.reactWithin(time) {
case TIMEOUT => f; fixedRateLoop
case 'stop =>
}
}
Actor.actor(fixedRateLoop)
}
И давайте проверим это (я сделал это правильно в Scala REPL), используя актера клиента теста:
case class Ping(t: Long)
import Actor._
val test = actor { loop {
receiveWithin(3000) {
case Ping(t) => println(t/1000)
case TIMEOUT => println("TIMEOUT")
case 'stop => exit
}
} }
Запустить планировщик:
import compat.Platform.currentTime
val sched = scheduler(2000) { test ! Ping(currentTime) }
и вы увидите что-то вроде этого
scala> 1249383399
1249383401
1249383403
1249383405
1249383407
, что означает, что наш планировщик отправляет сообщение каждые 2 секунды, как и ожидалось. Остановим планировщик:
sched ! 'stop
тестовый клиент начнет сообщать о таймаутах:
scala> TIMEOUT
TIMEOUT
TIMEOUT
остановите это также:
test ! 'stop