Scala 未来会有新的线索吗?

Scala 未来会有新的线索吗?,scala,twitter-util,Scala,Twitter Util,像下面这样实现的未来会得到一个新线程吗?显然不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我应该怎么做 package MyTest import com.twitter.util._ import scala.language.postfixOps object Test { def test1 = Future { println("BeforeTest", Thread.currentThread()) Thread.sleep(5000)

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

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())
  }
}
输出:

(主线程[run-main-0,5,run-main-group-0])

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

(后测试,螺纹[run-main-0,5,run-main-group-0])

成功的未来


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

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

您使用的是twitter期货,而不是scala期货。 默认情况下,Twitter期货不是多线程的。 您必须使用(将ExecutorService与您选择的线程池一起传递给它)

未经测试的示例(我希望足够简单):


他正在使用Twitter期货导入com.Twitter.util.\u感谢您提供的信息。成功了。程序现在没有退出(我正在通过sbt运行)。你为什么这么认为?你必须关闭执行器:executor.shutdown()
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()
}