Учитывая, что нерестовые потоки в контейнерах Java EE обескуражены. Будет ли обескураживать использование параллельных потоков Java 8, которые могут порождать потоки, внутри Java EE?
Не рекомендуется ли использовать параллельные потоки Java 8 внутри контейнера Java EE?
Ответ 1
РЕДАКТИРОВАТЬ См альтернативный ответ от andrepnh
. Ниже, возможно, был план, но, похоже, на практике это не получилось.
То, как я читал это из обсуждения списка рассылки lambda-dev, упомянутого в комментариях: это не обескураживало то, как создаются потоки, но ничего не сделает для вас в контексте Java EE.
Из связанной дискуссии:
об этом уже говорили участники Java EE, и в настоящее время FJP будет постепенно переходить к однопоточному (даже вызывающему контексту) выполнению при запуске из контейнера EE.
Таким образом, вы можете безопасно использовать параллельные потоки в процедуре или библиотеке, которые работают в обоих контекстах. Когда он работает в среде SE, он будет работать с магическими параллельными махинациями - но когда он будет работать в среде EE, он будет постепенно переходить в последовательное исполнение.
Примечание: приведенная выше фраза относится к будущему времени - есть ли у кого-нибудь цитата для какой-либо окончательной документации?
Ответ 2
А голова вверх, изящная деградация в один поток недоступна. Я также думал, что это из-за ответа Шорна и обсуждения в рассылке, но я узнал, что это не было, исследуя этот вопрос. Механизм не входит в спецификацию Java EE 7, а не в стеклянной платке 4.1. Даже если другой контейнер сделает это, он не будет переносимым.
Вы можете проверить это, вызвав следующий метод:
@Singleton
public class SomeSingleton {
public void fireStream() {
IntStream.range(0, 32)
.parallel()
.mapToObj(i -> String.format("Task %d on thread %s",
i, Thread.currentThread().getName()))
.forEach(System.out::println);
}
}
И вы получите что-то вроде:
Info: Task 20 on thread http-listener-1(4)
Info: Task 10 on thread ForkJoinPool.commonPool-worker-3
Info: Task 28 on thread ForkJoinPool.commonPool-worker-0
...
Я также проверил исходный код glassfish 4.1.1, и нет ни одного использования ForkJoinPool
, ForkJoinWorkerThreadFactory
или ForkJoinWorkerThread
.
Механизм может быть добавлен в EE 8, поскольку многие фреймворки будут использовать функции jdk8, но я не знаю, является ли это частью спецификации.