Подтвердить что ты не робот

Не рекомендуется ли использовать параллельные потоки Java 8 внутри контейнера Java EE?

Учитывая, что нерестовые потоки в контейнерах Java EE обескуражены. Будет ли обескураживать использование параллельных потоков Java 8, которые могут порождать потоки, внутри Java EE?

4b9b3361

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