Можно ли использовать invokeAll в рамках RecursiveTask? - PullRequest
0 голосов
/ 19 октября 2018

Я прочитал, что следующий код:

invokeAll(a2, a1);

эквивалентен:

a2.compute();
a1.join();

в RecursiveAction в Fork-Join.

Однако,так как RecursiveTask возвращает значение, у нас может быть что-то вроде:

Integer result1 = t2.compute();
Integer result2 = t1.join();

А затем мы должны объединить result1 и result2 для получения окончательного результата.

Теперь мои сомнения:

  • Можно ли использовать invokedAll для заданий RecursiveTasks?

  • Если да, как объединить результат вызовов invokeAll для получения окончательного результата?

1 Ответ

0 голосов
/ 21 октября 2018

Метод invokeAll можно использовать для RecursiveTask с.В качестве параметров требуется два ForkJoinTask с, и поскольку RecursiveTask расширяет ForkJoinTask, RecursiveTask может использоваться как ForkJoinTask.

Что касается получения результатов, invokeAll ничего не возвращает, поэтому вы не получите информацию таким образом.Что вы можете сделать, это вызвать метод join для каждого из ваших RecursiveTask s.Поскольку вы знаете, что обе задачи завершены к моменту возврата invokeAll, метод join будет возвращаться очень быстро.

invokeAll(t1, t2);
Integer result1 = t1.join();
Integer result2 = t2.join();

Однако на этом этапе вы также можете просто делать то, что делали.изначально звонил compute и join.Использование invokeAll немного неуклюже, когда у вас есть только две задачи и вам нужны оба их результата.

...