This answer指示如何java.util.concurrent.Future
轉換成scala.concurrent.Future
,同時管理將發生阻塞:爲什麼新的線程,而不是未來{...}
import java.util.concurrent.{Future => JFuture}
import scala.concurrent.{Future => SFuture}
val jfuture: JFuture[T] = ???
val promise = Promise[T]()
new Thread(
new Runnable {
def run() { promise.complete(Try{ jfuture.get }) }
}
).start
val future = promise.future
我queston是相同的意見提出的問題:
future { jfuture.get }
有什麼不對?爲什麼你使用一個額外的線程與Promise結合?
有人回答如下:
它會阻止你的拉線線程。如果你爲這樣的期貨有一個配置好的ExecutionContext,那沒問題,但是默認的ExecutionContext包含與你有處理器一樣多的線程。
我不確定我是否理解說明。重申:
future { jfuture.get }
怎麼了?未來是否會像手動創建新線程一樣阻塞,並阻止它?如果不是,它有什麼不同?
你究竟有什麼不明白的地方?阻塞線程的含義是什麼? –
@AlexeiKaigorodov我有點修改了我的問題:'future {jfuture.get}'有什麼問題?未來是否會像手動創建新線程一樣阻塞,並阻止它?如果不是,它有什麼不同? –
是在未來的阻擋是AS BAD手動創建一個新的線程和阻塞在那裏。轉換爲'scala.concurrent.Future'的想法是通過使用'onComplete'而不是'get'完全避免阻塞。 –