Java 在Scala的ForkJoinPool中';s";“未来”;,为什么工人的ID总是奇数?
代码如下:Java 在Scala的ForkJoinPool中';s";“未来”;,为什么工人的ID总是奇数?,java,multithreading,scala,threadpool,fork-join,Java,Multithreading,Scala,Threadpool,Fork Join,代码如下: import scala.concurrent._ import ExecutionContext.Implicits.global import scala.concurrent.duration._ val is = 1 to 100 toList def db = s"${Thread.currentThread}" def f(i: Int) = Future { println(db) ; 2 * i } val theFuture = Future.traverse
import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.concurrent.duration._
val is = 1 to 100 toList
def db = s"${Thread.currentThread}"
def f(i: Int) = Future { println(db) ; 2 * i }
val theFuture = Future.traverse(is)(f _)
Await.result(theFuture, 10.seconds)
我运行了很多次,结果如下:
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-1,5,main]
Thread[ForkJoinPool-1-worker-5,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-7,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
模式始终为“Thread[ForkJoinPool-1-worker-”${anodnumber}”,5,main]。有人知道为什么worker的ID总是奇数而不是偶数吗?您使用的是
ExecutionContext.Implicits.global
执行上下文。在引擎盖下,它使用ForkJoinPool
来处理工作线程。Scala库开发人员将这个ForkJoinPool
分叉,以便根据需要对其进行相应的修改。你可以找到它
请参阅名为registerWorker
的函数。worker的名称是通过添加前缀(名为workerNamePrefix
,默认值为“ForkJoinPool-${POOL\u ID}-worker-”
)和池索引来构造的,池索引总是作为奇数()计算的。因此,无论发生什么情况,这个数字总是奇数。这是由于实现避免了扫描工作队列数组,而是将其视为两个哈希表的幂(这需要对双哈希进行奇数索引。您可以查看一些有关哈希表的文档以了解更多信息)
因此,您只需获得1、3、5和7作为工作编号,因为您可能有一台4核计算机。如果希望它们在输出中更分散,只需在工作中添加一些延迟,以使其他工作人员也保持忙碌。像这样:
def f(i: Int) = Future { println(db); Thread.sleep(100); 2 * i }
希望有帮助