2017-10-13 61 views
0

下面的代码没有预料到什么。Scala未来 - 初学者查询

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext 

object UseFuture extends App 
{ 
    implicit val ec = ExecutionContext.global 
    Future(println { "This should be run in another thread" }) 
    println("Test") 
} 

但我没能看到未来的输出。

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext 

object UseFuture extends App 
{ 
    implicit val ec = ExecutionContext.global 
    Future(println { "This should be run in another thread" }) 
} 

一个快速的解释?

+4

也许你未来之前完成项目被定?尝试在最后添加一个'Thread.sleep'。 – Thilo

回答

1

@Thilo是正确的,你的应用程序退出比Future开始执行更快。 基本上,使用Await.result是不是好的做法when you work with Future,所以这个例子只作教育用途:)

import scala.concurrent.{Await, ExecutionContext, Future} 
import scala.concurrent.duration._ 

object UseFuture extends App 
{ 
    implicit val ec = ExecutionContext.global 
    println(s"Current thread: ${Thread.currentThread().getId}") 
    val future = Future(println { s"Thread id in future: ${Thread.currentThread().getId}. This should be run in another thread" }) 

    Await.result(future, 15.seconds) 
    println("Future has been executed") 
} 
+0

有趣。谢谢。我认为在Java中,除非我们调用System.exit(),否则程序会在所有线程完成后退出。这里有没有可能的事情? –

+0

Future是一个尚未存在的值的占位符,println是一个副作用函数,因此Await仍然不需要等待结果,程序仍然可以比显示println字符串更快结束。 – Emilia

+1

@RasterR,Scala被编译为JVM字节码,所以规则应该是一样的。如果主线程完成并且没有其他非守护线程(用户线程),JVM将退出程序。 –