【发布时间】:2014-02-07 00:48:42
【问题描述】:
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
我的问题与cmets中提出的问题相同:
future { jfuture.get }有什么问题?为什么你使用一个额外的线程来结合 Promise?
回答如下:
它会阻塞线程拉动中的线程。如果您为此类期货配置了 ExecutionContext,那很好,但默认的 ExecutionContext 包含与您拥有的处理器一样多的线程。
我不确定我是否理解解释。重申:
future { jfuture.get } 有什么问题?在未来内部阻塞与手动创建一个新线程并在那里阻塞不一样吗?如果不是,有什么不同?
【问题讨论】:
-
你到底有什么不明白的?线程阻塞是什么意思?
-
@AlexeiKaigorodov 我稍微修改了我的问题:
future { jfuture.get }有什么问题?在未来内部阻塞与手动创建一个新线程并在那里阻塞不一样吗?如果不是,有什么不同? -
是的,在未来阻塞是很糟糕的,因为手动创建一个新线程并在那里阻塞。转换为
scala.concurrent.Future的想法是通过使用onComplete而不是get来完全避免阻塞。
标签: java multithreading scala blocking future