未来是否会获得新线程?

时间:2016-02-19 08:12:30

标签: scala twitter-util

未来如下所示实现新线程吗?显然它不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我该怎么办?

IE9

输出:

(主,线程[运行主0,5,运行主基团的0])

(BeforeTest,螺纹[运行主0,5,运行主基团的0])

(AfterTest,螺纹[运行主0,5,运行主基团的0])

成功的未来

(main123,线程[运行主0,5,运行主基团的0])

2 个答案:

答案 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()(以及其他方法,如mapflatMapfilter等。 )。一个非常重要的实现可以为计算的每个未来创建一个新线程,但主要发生的是这样的代码由JVM上的工作线程池执行。