3

像下面这样实现的未来是否会获得一个新线程?显然不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我应该怎么做?

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])

(BeforeTest,Thread[run-main-0,5,run-main-group-0])

(AfterTest,Thread[run-main-0,5,run-main-group-0])

成功的未来

(main123,Thread[run-main-0,5,run-main-group-0])

4

2 回答 2

5

您使用的是 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()
}
于 2016-02-19T08:47:20.033 回答
-1

s的有趣之处之一Future是您不必自己处理线程。它们的执行方式完全取决于ExecutionContext传递给Future.apply()方法的隐式(以及其他方法,如map, flatMap,filter等)。一个非常粗略的实现可以为每个正在计算的未来创建一个新线程,但最常见的是此类代码由 JVM 上的工作线程池执行。

于 2016-02-19T08:42:47.133 回答