Не рекомендуется ли использовать параллельные потоки Java 8 внутри контейнера Java EE?
Учитывая, что порождающие потоки в контейнерах Java EE не приветствуются. Будет ли препятствовать использованию параллельных потоков Java 8, которые могут порождать потоки внутри Java EE?
2 ответа
То, как я прочитал это из обсуждения списка рассылки lambda-dev, упомянутого в комментариях: это не обескураживает то, как создаются потоки, - но ничего не сделает для вас в контексте Java EE.
Из связанной дискуссии:
об этом уже говорили участники Java EE, и в настоящее время FJP будет постепенно переходить к однопоточному (даже вызывающему контексту) исполнению при запуске из контейнера EE.
Таким образом, вы можете безопасно использовать параллельные потоки в процедуре или библиотеке, которые работают в обоих контекстах. Когда он работает в среде SE, он будет работать с магическими параллельными махинациями - но когда он будет работать в среде EE, он будет постепенно переходить в последовательное исполнение.
Примечание: приведенная выше фраза относится к будущему времени - есть ли у кого-нибудь цитата для какой-либо окончательной документации?
Напомним, что постепенная деградация до одного потока недоступна. Я также подумал, что это из-за ответа Шорна и обсуждения в списке рассылки, но я обнаружил, что это было не во время исследования этого вопроса. Механизм отсутствует в спецификации Java EE 7 и отсутствует в Glassfish 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, но я не знаю, является ли это частью спецификации.