標準ライブラリだけを使用して、それをそのまま使用することは何もありません。 Javaの予定の先物とは異なり、この実装はさせないことを
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits._
DelayedFuture(5 seconds)(println("Hello"))
注:これは、このように使用することができます
object DelayedFuture {
import java.util.{Timer, TimerTask}
import java.util.Date
import scala.concurrent._
import scala.concurrent.duration.FiniteDuration
import scala.util.Try
private val timer = new Timer(true)
private def makeTask[T](body: => T)(schedule: TimerTask => Unit)(implicit ctx: ExecutionContext): Future[T] = {
val prom = Promise[T]()
schedule(
new TimerTask{
def run() {
// IMPORTANT: The timer task just starts the execution on the passed
// ExecutionContext and is thus almost instantaneous (making it
// practical to use a single Timer - hence a single background thread).
ctx.execute(
new Runnable {
def run() {
prom.complete(Try(body))
}
}
)
}
}
)
prom.future
}
def apply[T](delay: Long)(body: => T)(implicit ctx: ExecutionContext): Future[T] = {
makeTask(body)(timer.schedule(_, delay))
}
def apply[T](date: Date)(body: => T)(implicit ctx: ExecutionContext): Future[T] = {
makeTask(body)(timer.schedule(_, date))
}
def apply[T](delay: FiniteDuration)(body: => T)(implicit ctx: ExecutionContext): Future[T] = {
makeTask(body)(timer.schedule(_, delay.toMillis))
}
}
: 最も簡単なユースケースの場合、あなたはこのような小さなヘルパーを使用することができますあなたは未来をキャンセルします。
'待ちます.ready'は 'blocking 'を使用しています。したがって、5秒間作業している場合、少なくとも基礎となるプールがそのスレッドをスピンアップできます。 –
この(または元の質問)がうまくいくために必要な輸入品は見やすいものです。私は彼らがscala.concurrent.duration._とscala.concurrentだと思う。_ – akauppi