2017-10-13 16 views
0

次のコードは期待されることを行います。スカラ未来 - 初心者クエリ

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

未来はまだ存在しない値のプレースホルダーです、printlnは副作用の関数なので、Awaitはまだ結果を待つ必要はなく、println文字列を表示するよりも速く終了することができます。 – Emilia

+1

@RasterR、ScalaはJVMバイトコードにコンパイルされているので、ルールは同じでなければなりません。メインスレッドが終了し、非デーモンスレッド(ユーザスレッド)が他に存在しない場合、JVMはプログラムを終了します。 –