2017-10-07 149 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实际在做什么,但是有人可以解释一般情况吗?我只熟悉使用期货时他们被分配到一个变量,然后在稍后的某个方面检查完成。

帮助将不胜感激! (对不起,格式不好,我从我的手机这样做)

回答

5

三个字给你:“火,忘了”。 如果您了解这种情况,那么将来分配给一个变量,然后再进行检查/转换时,您就已经知道这里发生了什么:Future的内部正在异步执行。

唯一的区别是在这种情况下,它永远不会再被访问。为什么?可能是因为没人关心。有些操作在完成时会返回结果,稍后可以使用,其他操作则不会。例如,如果我想要异步打印日志消息,我会写一些像Future { logger.info(mymessage) }而不分配给任何东西。为什么?那么,我真的不在乎什么时候(或者甚至)是否完成。没有我可以使用的返回值,并且,如果失败......呃,除了忽略错误之外,我没有任何有意义的方式来处理这个问题。

对于这样的操作,我不需要等待它完成,因为它无论如何都不会返回任何有用的东西。所以,我可以开始它,忘记。无需将其分配给任何东西。

+4

主线程在未来完成之前终止如何?你不需要等待未来吗? –

+2

@VictorMoroz当系统中只剩下守护进程线程时,JVM将存在。因此,如果您的执行程序配置为创建守护程序线程(默认情况下为true),或者还有其他非守护程序线程仍在运行,则即使在存在主线程后,该进程也会保持不变。 如果你只创建守护进程线程,那么是的,终止主线也会终止它们。这通常不是问题,因为你通常在类似“服务”的设置中看到类似这样的代码,其中main(几乎)不会退出。 – Dima