我對 Scala 非常陌生,并且遵循 Scala Book Concurrency 部分(來自 docs.scala-lang.org)。根據他們在書中給出的示例,我撰寫了一個非常簡單的代碼塊來測驗使用 Futures:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
object Main {
def main(args: Array[String]): Unit = {
val a = Future{Thread.sleep(10*100); 42}
a.onComplete {
case Success(x) => println(a)
case Failure(e) => e.printStackTrace
}
Thread.sleep(5000)
}
}
編譯并運行時,會正確列印出:
未來(成功(42))
到控制臺。我很難理解為什么Thread.sleep()呼叫是在 onComplete 回呼方法之后進行的。直觀地說,至少對我來說,會Thread.sleep()在回呼之前呼叫,所以當主執行緒到達該onComplete方法時,a它會被分配一個值。如果我將Thread.sleep()呼叫移至 before a.onComplete,則控制臺不會列印任何內容。我可能想多了,但任何幫助澄清將不勝感激。
uj5u.com熱心網友回復:
當您使用Thread.sleep()注冊回呼后
a.onComplete {
case Success(x) => println(a)
case Failure(e) => e.printStackTrace
}
Thread.sleep(5000)
然后正在執行未來主體的執行緒有時間休眠一秒鐘并將其設定42為未來成功執行的結果。到那時(大約 1 秒后),onComplete回呼已經注冊,所以執行緒也會呼叫它,并且您會在控制臺上看到輸出。
順序基本上是:
- t = 0:守護執行緒開始計算
42 - t = 0:主執行緒創建并注冊回呼。
- t = 1:守護執行緒完成計算
42 - t = 1 eps:守護執行緒找到注冊的回呼并使用結果呼叫它
Success(42)。 - t = 5:主執行緒終止
- t = 5 eps:程式停止。
(我在eps一些相當小的時間間隔內非正式地用作占位符; eps意思是“幾乎立即”。)
如果你交換和a.onComplete外部Thread.sleep
Thread.sleep(5000)
a.onComplete {
case Success(x) => println(a)
case Failure(e) => e.printStackTrace
}
那么正在執行未來主體的執行緒將42在一秒鐘后計算結果,但它不會看到任何注冊的回呼(它必須再等待四秒鐘,直到回呼被創建并在主執行緒上注冊)。但是一旦 5 秒過去了,主執行緒注冊回呼并立即退出。即使到那個時候它有機會知道結果42已經被計算出來,主執行緒也不會嘗試執行回呼,因為它不關它的事(這就是執行背景關系中的執行緒的用途)。因此,在注冊回呼后,主執行緒立即退出。有了它,執行緒池中的所有守護執行緒都被殺死,程式退出,這樣你在控制臺中就看不到任何東西了。
通常的事件順序大致是這樣的:
- t = 0:守護執行緒開始計算
42 - t = 1:守護執行緒完成 的計算
42,但不能對它做任何事情。 - t = 5:主執行緒創建并注冊回呼
- t = 5 eps:主執行緒終止,守護執行緒被殺死,程式停止。
因此(幾乎)沒有時間讓守護執行緒喚醒、找到回呼并呼叫它。
uj5u.com熱心網友回復:
Scala 中的很多東西都是函式,不一定看起來像它。的論點onComplete就是其中之一。你寫的是
a.onComplete {
case Success(x) => println(a)
case Failure(e) => e.printStackTrace
}
畢竟 Scala 的魔力實際上轉化為什么(取模PartialFunction惡作劇)
a.onComplete({ value =>
value match {
case Success(x) => println(a)
case Failure(e) => e.printStackTrace
}
})
onComplete實際上并沒有做任何作業。它只是設定了一個稍后會呼叫的函式。所以我們希望盡快這樣做,Scala 調度程式(特別是ExecutionContext)將在方便時呼叫我們的回呼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/486215.html
上一篇:從Scala中的檔案中讀取元組
下一篇:Scala:提升陣列
