Я использую ExecutorService для процесса multiThread - у меня есть список идентификаторов, для каждого ID я делаю часть кода с помощью потоков.ConcurrentModificationException при попытке выполнить MultiThread в партиях
ExecutorService executor = Executors.newFixedThreadPool(4);
for (String id : listOfIDs) {
Runnable worker = new WorkerThread(id);
executor.execute(worker);
}
executor.shutdown();
....
Все работает нормально, и результаты ожидаются. Но поскольку у меня много идентификаторов, мне нужно сделать эту часть более эффективной. У меня проблема с производительностью, и кажется, что это связано с созданием Lof WorkerThreads. Я решил запустить его для списка baseIds, а позже в запустил метод в WorkerThread (или в другом методе, называемом оттуда), через список по потоку. Но у меня проблема с java.util.ConcurrentModificationException. Что я делаю не так?
for (String id : listOfIDs) {
listForThreads.add(id);
if (listForThreads.size() >= 100) {
Runnable worker = new WorkerThread(listForThreads);
executor.execute(worker);
listForThreads.clear();
}
}
....
public static class WorkerThread implements Runnable {
private List<String> listForThreads;
public WorkerThread (List<String> listForThreads) {
this.listForThreads = listForThreads;
}
public void run() {
for (String id : listForThreads) {
process(id);
}
} ....
Я думал, что обработаю больше идентификаторов только в одном потоке, а не в потоке. Можно ли использовать ExecutorService для запуска некоторых процессов в «партиях»?
Вы можете показать код для метода процесса? [ConcurrentModificationException] (http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html) происходит при модификации (добавлении/удалении элементов) коллекции, в то же время итерации над ним. – linski