This answerの新しいスレッドは、scala.concurrent.Future
にjava.util.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'に変換するという考えは、' get'の代わりに 'onComplete'を使って完全にブロックするのを避けることです。 –