В чем разница между get () и invoke () в Java 7 ForkJoinTask?

Вот javadoc для обоих:

  1. get (): при необходимости ожидает завершения вычисления, а затем получает его результат.
  2. invoke (): начинает выполнение этой задачи, ожидает ее завершения, если необходимо, и возвращает свой результат, или генерирует (не отмеченное) исключение RuntimeException или ошибку, если это было выполнено базовым вычислением.

person pathikrit    schedule 05.04.2012    source источник


Ответы (1)


get () поддерживает прерывистое и / или рассчитанное по времени ожидание завершения и сообщает о результатах с использованием соглашений Future. Метод invoke () семантически эквивалентен fork (); join (), но всегда пытается начать выполнение в текущем потоке.

person NiranjanBhat    schedule 05.04.2012
comment
Если меня не волнуют время / прерывания и я точно знаю, что мой вызов get () не вызовет исключение ExecutionException, следует ли мне просто использовать invoke (), тогда или у invoke () есть другие недостатки? Какой из них лучше с точки зрения производительности - мой вариант использования включает отправку тысяч связанных операций ввода-вывода ForkJoinTasks в статический ForkJoinPool, и я должен решить, следует ли мне вызывать get () или invoke () в ForkJoinTask, возвращаемом методом submit () объекта ForkJoinPool. - person pathikrit; 05.04.2012
comment
Подождите минуту! ForkJoinTask имеет это ограничение. Задачи также не должны выполнять блокировку ввода-вывода. Если вы знаете об этом ограничении и все еще хотите продолжить, учитывая производительность в качестве основного критерия, я бы предложил использовать get (), поскольку это будет выполняться непосредственно пулом, в отличие от invoke (), где он сначала попытается вызвать выполнение. в текущем потоке. - person NiranjanBhat; 05.04.2012