Не рекомендуется ли использовать параллельные потоки 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, но я не знаю, является ли это частью спецификации.

Другие вопросы по тегам