下面这样实现的未来会得到一个新线程吗?显然不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我该怎么办?
package MyTest
import com.twitter.util._
import scala.language.postfixOps
object Test {
def test1 = Future {
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())
}
}
输出:
(main,Thread[run-main-0,5,run-main-group-0])
(之前测试,线程[运行主-0,5,运行主组-0])
(测试后,线程[运行主-0,5,运行主组-0])
成功的未来
(main123,线程[运行主-0,5,运行主组-0])
你使用的是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()
}
Future
s的一个有趣的点是你不必自己处理线程。它们的执行方式完全取决于传递给Future.apply()
方法(以及其他方法,如map
、flatMap
、filter
等)的隐式ExecutionContext
。一个非常粗略的实现可以为正在计算的每个未来创建一个新线程,但大多数情况下,这样的代码是由 JVM 上的工作线程池执行的。