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

Java 将来的代码是否有机会在主线程中的代码之前运行?,java,multithreading,scala,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 您可以看到#

如果我运行以下代码

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
结束之前打印

我想可能是这样,因为当我运行
Future{}
时,它会将任务放在线程池中。由于线程切换点不确定,它可能有机会从主线程切换到池中的线程。在这种情况下,
####enter future
将在
###end

正确吗?

是的

由于未来的
正在另一个线程中执行,并且您没有在它们之间进行任何同步,所以谁先打印谁都是一个公开的竞争,并且由于主线程已经在运行,所以它很有可能先打印。

是的


由于未来的正在另一个线程中执行,并且您没有在它们之间进行任何同步,所以谁先打印谁都是一个公开的竞争,并且由于主线程已经在运行,它将首先打印的可能性非常高。

您是正确的,在一个线程的创建者之间没有执行顺序保证
Future
Future
的主体。在您的示例中,在单线程机器上,创建未来时创建线程不太可能挂起,但即使这样也不能保证,在任何多核机器上,关于执行顺序的任何假设都不存在


我知道Twitter的未来,有人试图看看代码是否可以内联执行,也就是说,它是否包含阻塞调用。我不认为scala原生的
Future
可以做到这一点,而是简单地在
ExecutionContext
的线程池中安排未来。

您是正确的,在
Future
的创建者和
Future
的主体之间没有执行顺序保证。在您的示例中,在单线程机器上,创建未来时创建线程不太可能挂起,但即使这样也不能保证,在任何多核机器上,关于执行顺序的任何假设都不存在


我知道Twitter的未来,有人试图看看代码是否可以内联执行,也就是说,它是否包含阻塞调用。我不认为scala原生的
Future
可以做到这一点,而是简单地在
ExecutionContext
的线程池中安排未来。

是的,未来很可能首先执行。试着把
Thread.sleep(1000)
放在
println(“#####end”)
之前。此外,如果你按照这样的顺序执行其中两个未来,甚至不能保证其中一个会先执行,更不用说当前线程中发生的事情了。是的,未来会先执行的可能性很小。试着把
Thread.sleep(1000)
放在
println(“####end”)
之前。此外,如果你按照这样的顺序执行其中两个未来,甚至不能保证其中任何一个都会先执行,更不用说当前线程中发生了什么。