2017-10-13 60 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將退出程序。 –