Вы не должны использовать ForkJoinPool в Java EE. Только сервер приложений должен предоставлять конструкции для параллелизма (например, ManagedExecutorService в Java EE 7), поскольку контейнер должен управлять потоками.
Любопытно, что в списке рассылки, упомянутом в этом ответе, есть сообщение, в котором утверждается, что ForkJoinPool изящно деградирует до однопоточного в ЕЕ-контейнер. Я тестировал это с помощью 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 21 on thread http-listener-1(4)
Info: Task 11 on thread ForkJoinPool.commonPool-worker-3
Info: Task 22 on thread http-listener-1(4)
Info: Task 8 on thread ForkJoinPool.commonPool-worker-3
Info: Task 23 on thread http-listener-1(4)
Info: Task 9 on thread ForkJoinPool.commonPool-worker-3
Info: Task 18 on thread http-listener-1(4)
Info: Task 14 on thread ForkJoinPool.commonPool-worker-3
Info: Task 19 on thread http-listener-1(4)
Info: Task 15 on thread ForkJoinPool.commonPool-worker-3
Info: Task 16 on thread http-listener-1(4)
Info: Task 17 on thread http-listener-1(4)
Info: Task 4 on thread http-listener-1(4)
Info: Task 5 on thread http-listener-1(4)
Info: Task 6 on thread http-listener-1(4)
Info: Task 7 on thread http-listener-1(4)
Info: Task 2 on thread http-listener-1(4)
Info: Task 3 on thread http-listener-1(4)
Info: Task 0 on thread http-listener-1(4)
Info: Task 1 on thread http-listener-1(4)
Info: Task 26 on thread http-listener-1(4)
Info: Task 27 on thread http-listener-1(4)
Info: Task 24 on thread http-listener-1(4)
Info: Task 25 on thread http-listener-1(4)
Info: Task 12 on thread http-listener-1(4)
Info: Task 13 on thread http-listener-1(4)
Info: Task 30 on thread http-listener-1(4)
Info: Task 31 on thread http-listener-1(4)
Info: Task 28 on thread ForkJoinPool.commonPool-worker-0
Info: Task 29 on thread ForkJoinPool.commonPool-worker-0
Возможно, деградация станет доступной в Java EE 8, когда в большинстве отдельных спецификаций будут использоваться функции SE 8.
Изменить
Я проверил исходный код Glassfish 4.1.1 и не нашел ни одного случая использования ForkJoinPool
, ForkJoinWorkerThreadFactory
или ForkJoinWorkerThread
. Таким образом, ресурсы параллелизма, управляемые сервером приложений, не основаны ни на одной из этих конструкций. К сожалению, на самом деле нет доступного механизма деградации.
person
andrepnh
schedule
01.04.2016