2017-10-07 148 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