如果我运行以下代码,
import scala.concurrent.ExecutionContext.Implicits.global
println("### start")
Future {
println("### enter future")
Thread.sleep(2000)
println("### exit future")
}
println("### end")
打印:
### start
### end
### enter future
您可以在### end
之前看到### enter future
。
我的问题是,### enter future
之前是否有机会### end
打印?
我想它可能是,因为当我运行Future {}
时,它会将任务放在一个线程池中。由于线程切换点未经确认,因此可能有机会从主线程切换到池内的线程。在这种情况下,我会在### enter future
### end
这是对的吗?
答案 0 :(得分:2)
是
由于Future
正在另一个线程中执行,并且你没有在它们之间进行任何同步,无论谁先进行打印都是一场公开竞赛,而且由于主线程已经在运行,因此很有可能先打印。
答案 1 :(得分:2)
您是正确的,Future
的创建者与Future
的正文之间没有执行顺序保证。在您的示例中,在单线程计算机上创建未来时创建线程不太可能被挂起,但即使这样也无法保证,并且在任何多核计算机上,任何有关执行顺序的假设都会消失。
我知道Twitter的Future
,有一些尝试看看代码是否可以内联执行,即它是否包含阻塞调用。我不认为scala native Future
这样做,但是简单地在ExecutionContext
的ThreadPool上安排未来。