У вас есть два недостатка:
- Использовать non-threadsafe (
List
) контейнер без синхронизации - Доступ к списку, в то время как ваш модифицированный поток может быть не возвращен.
Чтобы решить (1), я предлагаю вам использовать потокобезопасный контейнер, такой как Vector
, после чего вы можете преобразовать его в List
после завершения.
Чтобы решить (2), вы можетеиспользуйте Thread.join()
, чтобы убедиться, что все вызовы API завершены, прежде чем переходить к следующему.
Еще одно замечание: вы не хотите вызывать Thread.join()
в цикле for
.Это заблокирует цикл.Вместо этого просто start()
и сохраните обработчики потоков в массиве, затем после цикла for
вы перебираете обработчик потоков и вызываете join()
:
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < eventsSize; i++) {
if (...) {
Thread t = new Thread()...;
t.start(); // Don't call join() after start() here
threads.add(t);
} else {
...
}
}
// Instead call join here:
for (Thread t : threads) {
t.join(); // Need try catch
}
.. bla bla..