2017-10-07 4 views
2

私はscalaを使い慣れていません。コードベースでこのコードが何をしているのかを理解しようとしています。私はのようなことを行い、いくつかのScalaのコードを見てきましたスカラ未来が割り当てられていない、これは何ですか?

仕様の一部を削除し、私は理解していないチャンクはこれです

val someA = something.createSomeA(....) 

Future { 
     someA.doSomething1(....) 
     someA.doSomething2(.....) 
} 
// then log some things unrelated to the future 
someA 
// end of func 

を私は本当に何を理解していませんこの場合、未来は何にも割り当てられていないので、未来はやっています。未来がここで何をしているのか誰かが説明できますか? 詳細はdoSomethingsが実際に行っていることに依存していることは知っていますが、誰かが一般的にこれについて何か説明できますか?私は、Futuresが変数に代入され、後で何らかの方法で補完をチェックするときに、Futuresの使用に慣れています。

ご了承ください。 (貧弱な書式設定には申し訳ありませんが、私は携帯電話からこれをやっています)

答えて

5

あなたのために3つの言葉: "火と忘れ"。 このケースを理解すると、未来が変数に割り当てられ、後でチェック/変換されると、ここで何が起こっているのかが分かります。Futureの内部は非同期で実行されています。

唯一の違いは、この場合は再びアクセスされないことです。どうして?おそらく誰も気にしないからです。一部の操作は、完了したときに結果を返します。後で使用できる操作もあれば、後で使用できる操作もあります。

たとえば、ログメッセージを非同期で出力したい場合は、Future { logger.info(mymessage) }のようなものを何も割り当てずに書きます。どうして?まあ、私は本当にそれが完了しても(あるいは終わっても)気にしません。私が使用できる戻り値はなく、失敗した場合は...エラーを無視する以外には、それを処理する意味のある方法はありません。

このような操作では、私にとって役立つものは何も返されないため、完了するのを待つ必要はありません。だから、私はそれを始めて忘れることができます。それを何かに割り当てる必要はありません。

+4

今後の完了前に終了するメインスレッドはどうですか?その未来を待つ必要はありませんか? –

+2

@VictorMoroz JVMは、デーモンスレッドのみがシステムに残っている場合に存在します。したがって、エグゼキュータがデーモン・スレッドを作成するように構成されている場合(デフォルトではtrue)、またはデーモン以外のスレッドがまだ実行されていない場合は、メイン・スレッドが存在してもプロセスは停止します。 デーモンスレッドのみを作成している場合は、mainを終了するとすべてが終了します。これは通常は問題ではありません。なぜなら、あなたは通常、メイン(ほぼ)決して退場しない「サービス」のような設定でこのようなコードを見るからです。 – Dima

関連する問題