Я читал в нескольких сообщениях, что использование JUnit для проверки параллелизма не является идеальным, но на данный момент у меня нет выбора. Я только что столкнулся с исключением, которое я не могу объяснить.JUnit и параллелизм: необъяснимая ошибка
Я бег теста, где, в итоге:
- отправленного 1000 runnables к исполнителю
- каждому работоспособной добавляет элемент в список
- я жду окончания исполнителя
- JUnit говорит, что список содержит только 999 элементов.
- Исключено исключение в управляемом блоке захвата
Что может вызывать такое поведение?
Примечание: Время от времени я получаю исключение. В коде есть некоторые несвязанные вещи, но я оставил его там, если я что-то пропустил. XXXQuery
- это перечисление.
public void testConcurrent() throws InterruptedException {
final int N_THREADS = 1000;
final XXXData xxxData = new AbstractXXXDataImpl();
final List<QueryResult> results = new ArrayList<>();
ExecutorService executor = Executors.newFixedThreadPool(N_THREADS);
for (int i = 0; i < N_THREADS; i++) {
final int j = i;
executor.submit(new Runnable() {
@Override
public void run() {
try {
results.add(xxxData.get(XXXQuery.values()[j % XXXQuery.values().length]));
} catch (Exception e) {
System.out.println(e);
}
}
});
}
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
assertEquals(N_THREADS, results.size());
}
Возможно, в определенных ситуациях 10 секунд недостаточно для завершения всех 1000 потоков? – mcfinnigan
В будущем, пожалуйста, предоставьте Exception и покажите, какая строка будет выполнена. Благодарю. – Gray
@mcfinnigan тесты заканчиваются менее чем за секунду. – assylias