2015-02-11 4 views
2

Пока я читал the javadoc about ForkJoinTask я наткнулся на следующее утверждение:Понимание метода invokeAll из ForkJoinTask

Этот метод может быть вызван только из ForkJoinPool вычислений (как это может быть определено с использованием метода inForkJoinPool()). Попытки использовать в других контекстах приводят к исключениям или ошибкам, возможно , включая ClassCastException.

Что мне непонятно, то, что означает ForkJoinContext. Я знаю, что означает статический контекст, например. Он четко определяет в JLS 8.1.3 следующим образом (Подчеркните мой):

заявление или выражение происходит в статическом контексте тогда и только тогда, когда сокровенного метод, конструктор, инициализатор экземпляра, статический инициализатора, поле инициализатора , или явным вызовом конструктора. Оператор, содержащий оператор или выражение, является статическим методом, статическим инициализатором , инициализатором переменной статической переменной или явным вызовом вызова конструктора (§8.8.7).

ответ

3

Контекст, обсуждаемый здесь, не является статическим/нестационарным контекстом.

Это означает, что метод должен вызываться из потока, который принадлежит ForkJoinPool.

Так что это должно быть вызвано из рекурсивной задачи. Вызов из любого другого места может вызвать исключения/ошибки.

Смежные вопросы