На первый взгляд, это происходит, когда при определенном, довольно редком чередовании потоков, новая отправленная задача добавляется в незащищенную коллекцию задач activeThreads, в то время как метод close уже обрабатывает элементы этой коллекции.
MRE предоставляет испытательный стенд для случай и эмулирует ситуацию, слегка изменяя исходный код SimpleAsyncTaskExecutor и обеспечивая чередование этих конкретных потоков. Результаты теста JCStress показывают, что, хотя процент соответствующего результата очень низок, доли процента, вероятность все равно больше нуля:
Код: Выделить всё
RESULT SAMPLES FREQ EXPECT DESCRIPTION
0 1,970,950 99.83% Acceptable Task executes on active executor
1 3,341 0.17% Forbidden Task executes on closed executor
Конечно, корректное завершение работы может иметь довольно широкое значение, но, например, ThreadPoolExecutor JDK не имеет этой проблемы. MRE также обеспечивает сравнение между двумя исполнителями.
Отсюда и вопрос:
Если разработчики SimpleAsyncTaskExecutor не намеревались реализовать такие сильные гарантии плавного завершения работы, как предоставляет ThreadPoolExecutor, не следует ли упомянуть этот факт в javadoc класса SimpleAsyncTaskExecutor, чтобы не делать этого сбить с толку пользователей, которые могли бы ожидать более серьезных гарантий?
Иначе следует ли считать эту ситуацию ошибкой?
Подробнее здесь: https://stackoverflow.com/questions/798 ... skexecutor
Мобильная версия