未来如下所示实现新线程吗?显然它不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我该怎么办?
IE9
输出:
(主,线程[运行主0,5,运行主基团的0])
(BeforeTest,螺纹[运行主0,5,运行主基团的0])
(AfterTest,螺纹[运行主0,5,运行主基团的0])
成功的未来
(main123,线程[运行主0,5,运行主基团的0])
答案 0 :(得分:4)
您正在使用Twitter期货,而不是scala期货。 Twitter期货默认不是多线程的。 您必须使用FuturePool(使用您选择的线程池传递ExecutorService)
未经测试的例子(简单到工作我希望:)):
val executor = Executors.newFixedThreadPool(4)
val pool = FuturePool(executor)
def test1 = pool {
println("BeforeTest", Thread.currentThread())
Thread.sleep(5000)
println("AfterTest", Thread.currentThread())
}
def test2 = test1 onSuccess { case _ => println("Future on success") }
def main(args: Array[String]): Unit = {
println("main", Thread.currentThread())
test2
println("main123", Thread.currentThread())
executor.shutdown()
}
答案 1 :(得分:-1)
Future
的一个有趣点是你不必自己处理线程。它们的执行方式完全取决于传递给ExecutionContext
方法的隐式Future.apply()
(以及其他方法,如map
,flatMap
,filter
等。 )。一个非常重要的实现可以为计算的每个未来创建一个新线程,但主要发生的是这样的代码由JVM上的工作线程池执行。