Future中的代码是否有机会在主线程之前的代码之前运行?

时间:2015-05-01 06:16:15

标签: java multithreading scala

如果我运行以下代码,

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

这是对的吗?

2 个答案:

答案 0 :(得分:2)

由于Future正在另一个线程中执行,并且你没有在它们之间进行任何同步,无论谁先进行打印都是一场公开竞赛,而且由于主线程已经在运行,因此很有可能先打印。

答案 1 :(得分:2)

您是正确的,Future的创建者与Future的正文之间没有执行顺序保证。在您的示例中,在单线程计算机上创建未来时创建线程不太可能被挂起,但即使这样也无法保证,并且在任何多核计算机上,任何有关执行顺序的假设都会消失。

我知道Twitter的Future,有一些尝试看看代码是否可以内联执行,即它是否包含阻塞调用。我不认为scala native Future这样做,但是简单地在ExecutionContext的ThreadPool上安排未来。