Vấn đề là bạn đang thực hiện điều đó như một chương trình độc lập, mà chính thread là chấm dứt trước khi một trong các chủ đề công nhân có thể thực thi "Hello future!" println
. (Các chủ đề mà thư viện tương lai mới sinh ra là các chuỗi daemon).
Bạn cũng có thể sử dụng đối tượng Await
(cũng trong scala.concurrent
) đợi cho đến khi tương lai f
được hoàn thành:
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
println("Test print after future")
Await.ready(f, Duration.Inf)
}
}
này có thể in:
Test print before future
Test print after future
Hello future!
Hoặc, nó có thể in "Hello Tương lai!" trước khi "Thử in sau tương lai" tùy thuộc vào lịch trình của chuỗi.
Tương tự như vậy, bạn có thể buộc các chủ đề chính để chờ cho đến khi f
được hoàn thành trước cuối println
như sau:
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
Await.ready(f, Duration.Inf)
println("Test print after future")
}
}
Trong đó sẽ in:
Test print before future
Hello future!
Test print after future
Tuy nhiên, lưu ý rằng khi bạn sử dụng Await
, bạn đang chặn. Điều này tất nhiên có ý nghĩa để đảm bảo rằng chuỗi ứng dụng chính của bạn không chấm dứt, nhưng nói chung không nên được sử dụng trừ khi cần thiết khác.
(đối tượng Await
là một lối thoát cần thiết cho các tình huống như thế này, nhưng việc sử dụng nó trong suốt mã ứng dụng mà không cần quan tâm đến ngữ nghĩa của nó có thể dẫn đến thực thi chậm hơn, ít song song hơn. theo thứ tự được chỉ định, ví dụ, có các phương án thay thế khác, chẳng hạn như các phương pháp andThen
và map
trên Future
.)
Bạn biết không? Tôi nghĩ về nguyên nhân này là chính xác theo cách tương tự khi bạn xử lý goroutines: bạn sử dụng các kênh để chờ một tin nhắn được gửi bởi goroutines trước khi đóng khối chính. –
@Heather Có thể chờ đợi nhiều hơn một tương lai không? – 66CLSjY