Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Scala的ForkJoinPool中';s";“未来”;,为什么工人的ID总是奇数?_Java_Multithreading_Scala_Threadpool_Fork Join - Fatal编程技术网

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 }
希望有帮助