首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未来会有新的线索吗?

未来会有新的线索吗?
EN

Stack Overflow用户
提问于 2016-02-19 08:12:30
回答 2查看 771关注 0票数 3

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

代码语言:javascript
复制
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,Threadrun-main-0,5,run-main-group-0)

(BeforeTest,线程-主-0,5,运行-主-组-0)

(AfterTest,线程-主-0,5,运行-主-组-0)

成功的未来

(main123,线程-主-0,5,运行-主-组-0)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 08:47:20

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

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

代码语言:javascript
复制
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()
}
票数 5
EN

Stack Overflow用户

发布于 2016-02-19 08:42:47

Future的一个有趣之处是,您不必自己处理线程。它们的执行方式完全取决于传递给Future.apply()方法的隐式Future.apply()(以及其他方法,如mapflatMapfilter等)。一个非常粗略的实现可以为未来计算的每个线程创建一个新线程,但大多数情况是这样的代码是由JVM上的一个工作线程池执行的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35500396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档