Future 是否有新线程?

Does a Future get a new thread?

像下面这样实现的未来是否有新线程?显然不是(见下面的输出)。为什么?如果我想让我的代码在新线程上 运行 怎么办?

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[运行-main-0,5,运行-main-group-0])

(测试前,线程[运行-main-0,5,运行-main-group-0])

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

成功的未来

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

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

您使用的是 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()
}