尝试批量执行多线程时出现ConcurrentModificationException



我正在为多线程进程使用ExecutorService-我有一个ID列表,对于每个ID,我都使用线程生成代码的一部分。

ExecutorService executor = Executors.newFixedThreadPool(4);   
for (String id : listOfIDs) {
    Runnable worker = new WorkerThread(id);
    executor.execute(worker);
}
executor.shutdown();
....

一切都很顺利,结果如预期。但因为我有很多身份证,我需要更有效地完成这一部分。我有性能问题,似乎是因为创建了WorkerThreads的lof。我决定为baseId的列表运行它,稍后在中,在WorkerThread中运行方法(或在从那里调用的其他方法中),每个线程循环列表。但是我对java.util.CurrentModificationException有问题。我做错了什么?

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);
}   
} ....

我想我只会在一个线程中处理更多的id,而不是每个线程处理id。是否可以使用ExecutorService以"批处理"方式运行某些进程?

部分中的代码错误

for (String id : listOfIDs) {   
  listForThreads.add(id);
  if (listForThreads.size() >= 100) {
     Runnable worker = new WorkerThread(listForThreads);
     executor.execute(worker);
     listForThreads.clear();
   }
}

迭代列表时不应进行修改。在这里,您将与工作线程共享相同的列表实例。它们在列表的同一实例上迭代,并且在主线程中同时清除列表。理想情况下,无论何时与只执行只读操作的其他线程共享,都应该创建ArrayList的副本。使用**listForThreads.toArray创建ArrayList的副本(new String[listForThreads.size()])**或者通过克隆给定的列表,请参阅此问题的答案Java ArrayList复制

相关内容

  • 没有找到相关文章

最新更新