我很难理解如何确保在自己的ForkjoinPool中运行分叉任务,而不是让它使用公共池,如果您没有指示要在哪个线程池中运行,则会发生什么情况。
从下面的代码来看,我的fjp实例与新实例化的FibonacciCalculator对象之间似乎没有任何联系。这让我假设我的fjp实际上并没有被用于子任务。怎么做?
object FJPoolApp extends App {
val fjp = new ForkJoinPool()
println(fjp.submit(new FibonacciCalculator(10)).get)
}
class FibonacciCalculator(k : Int) extends RecursiveTask[Int] {
override def compute(): Int = {
if (k <= 1) k
else {
val left = new FibonacciCalculator(k-1).fork() <-- where is this being run?
val right = new FibonacciCalculator(k-2).fork() <-- where is this being run?
left.join() + right.join()
}
}
}发布于 2020-03-29 11:49:09
以下是ForkJoinTask#fork()文档中的内容:
安排异步执行当前任务正在运行的池中的任务,如果适用,添加重点,或者如果不使用
inForkJoinPool(),则使用ForkJoinPool.commonPool()。
这是ForkJoinTask#inForkJoinPool()的文档
如果当前线程是作为
计算执行的
ForkJoinWorkerThread,则ForkJoinPool返回true。
由于您在一个FibonacciCalculator中执行了原始ForkJoinPool,在任务中创建的分叉也会在同一个池中执行。
https://stackoverflow.com/questions/60913677
复制相似问题