我正在尝试在 Intellij Idea 中运行一个简单的 Future 示例:
import scala.concurrent.ExecutionContext.Implicits.global
object Futures1 extends App {
val f = Future {
Thread.sleep(500)
1 + 1
}
f map println
Thread.sleep(5)
}
而且还没有完成。 正如我所想,由于 threadPool 中主线程和线程之间的竞争。
我试着治疗它,通过:
申请等待:
Await.result(f map println, Duration(5, SECONDS))
自定义关闭守护线程的执行上下文:
class MyExecutionContext extends ExecutionContext {
override def execute(runnable:Runnable) = {
val t = new Thread(runnable)
t.setDaemon(false)
t.start()
}
override def reportFailure(t:Throwable) = t.printStackTrace
}
implicit lazy val context: ExecutionContext = new MyExecutionContext
但没有任何帮助。
还有什么办法?
问题是
f map println
产生了一个新的Future?
如果你说
println(Await.result(f, Duration(5, SECONDS)))
你的代码可以运行并打印出来 2.
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.concurrent.duration._
val f = Future {
println("running future")
1 + 1
}
println("maybe runs ahead or behind the future...")
println(Await.result(f, Duration(5, SECONDS)))
println("app finished")