首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将来在回调中运行在同一个线程中

将来在回调中运行在同一个线程中
EN

Stack Overflow用户
提问于 2013-11-24 12:11:38
回答 2查看 1.4K关注 0票数 3

当我运行这段代码时:

代码语言:javascript
运行
复制
val intList = List(1, 6, 8)

val listOfFutures = intList.map{
  i => future {
    println("future " +i)
    Thread.sleep(i* 1000)
    if (i == 12)
      throw new Exception("6 is not legal.")
    i
  }

}
val futureOfList = Future.sequence(listOfFutures)

futureOfList onSuccess{
  case int => {
    logInfo("onSuccess")
    int.foreach(i => {
      Future{
      logInfo("h : " + i)
      }
    })
  }
}

futureOfList onFailure{
  case int => {
    logInfo("onFailure")
  }
}

logInfo("after")

嵌套期货运行的线程都是相同的:

代码语言:javascript
运行
复制
future 1
2013/11/24 11:55:00.002 [ModelUtilsTest] [main]: INFO: [] after
future 6
future 8
2013/11/24 11:55:14.878 [ModelUtilsTest] [ForkJoinPool-1-worker-1]: INFO: [] onSuccess 
2013/11/24 11:55:15.378 [ModelUtilsTest] [ForkJoinPool-1-worker-1]: INFO: [] h : 1 
2013/11/24 11:55:15.378 [ModelUtilsTest] [ForkJoinPool-1-worker-1]: INFO: [] h : 6 
2013/11/24 11:55:15.378 [ModelUtilsTest] [ForkJoinPool-1-worker-1]: INFO: [] h : 8

为什么会发生这种事?我需要内在的未来并行运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-24 14:34:34

Future实现检查它是否要在拥有当前线程的ForkJoinPool上运行某些东西。在这种情况下,它将ForkJoinTask.fork(),它将新的工作单元添加到当前工作线程的工作队列中。任何其他线程都必须窃取该工作才能执行它。您不会期望在可用线程上看到任务的统一分布,特别是对于琐碎的任务。

在接下来的运行中,worker-9首当其冲:

代码语言:javascript
运行
复制
scala> val f = Future sequence (1 to 20 map (i => Future(i)))
f: scala.concurrent.Future[scala.collection.immutable.IndexedSeq[Int]] = scala.concurrent.impl.Promise$DefaultPromise@47fe4ff8

scala> f onSuccess { case is => is foreach (i => Future(println(s"$i on ${Thread.currentThread}"))) }

scala> 2 on Thread[ForkJoinPool-1-worker-9,5,main]
5 on Thread[ForkJoinPool-1-worker-15,5,main]
4 on Thread[ForkJoinPool-1-worker-3,5,main]
6 on Thread[ForkJoinPool-1-worker-9,5,main]
1 on Thread[ForkJoinPool-1-worker-5,5,main]
12 on Thread[ForkJoinPool-1-worker-7,5,main]
11 on Thread[ForkJoinPool-1-worker-9,5,main]
15 on Thread[ForkJoinPool-1-worker-9,5,main]
16 on Thread[ForkJoinPool-1-worker-9,5,main]
17 on Thread[ForkJoinPool-1-worker-9,5,main]
18 on Thread[ForkJoinPool-1-worker-9,5,main]
19 on Thread[ForkJoinPool-1-worker-9,5,main]
20 on Thread[ForkJoinPool-1-worker-9,5,main]
3 on Thread[ForkJoinPool-1-worker-1,5,main]
10 on Thread[ForkJoinPool-1-worker-13,5,main]
9 on Thread[ForkJoinPool-1-worker-11,5,main]
8 on Thread[ForkJoinPool-1-worker-3,5,main]
7 on Thread[ForkJoinPool-1-worker-15,5,main]
14 on Thread[ForkJoinPool-1-worker-7,5,main]
13 on Thread[ForkJoinPool-1-worker-5,5,main]
票数 2
EN

Stack Overflow用户

发布于 2013-11-24 12:25:21

有两种方法可以轻松地实现并行性:

首先,您可以从traverse伙伴对象中使用Future方法。

代码语言:javascript
运行
复制
import scala.collection.breakOut
import scala.concurrent.Future;
import scala.concurrent.ExecutionContext.Implicits.global

val modifiedList = Future.traverse(myList)(myFunc)

或者您可以使用par集合,它并行地运行映射。

代码语言:javascript
运行
复制
val modifiedList = myList.par.map(myFunc)(breakOut)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20174300

复制
相关文章

相似问题

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