Зная, на каком ForkJoinPool будет выполняться моя RecursiveTask - PullRequest
0 голосов
/ 29 марта 2020

Мне трудно понять, как убедиться, что я выполняю свои разветвленные задачи в своем собственном 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()
    }
  }
}

1 Ответ

1 голос
/ 29 марта 2020

Вот что говорит документация ForkJoinTask#fork():

Обеспечивает асинхронное выполнение этой задачи в пуле, в котором выполняется текущая задача [выделение добавлено] , если применимо, или использование ForkJoinPool.commonPool(), если не inForkJoinPool().

А вот документация ForkJoinTask#inForkJoinPool():

Возвращает true, если текущий поток представляет собой ForkJoinWorkerThread, выполняющийся как ForkJoinPool вычисление

Поскольку вы выполняете свое изначальное FibonacciCalculator в ForkJoinPool, Форки, созданные внутри задачи, также выполняются в том же том же пуле.

...