Понимание метода invokeAll для ForkJoinTask

Пока я читал javadoc о ForkJoinTask, я наткнулся на следующее утверждение:

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

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

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

1 ответ

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

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

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

licensed under cc by-sa 3.0 with attribution.