Java 此代码块的并发修改异常,请提供帮助?
missedMSRB是一个包含2187个元素的列表,当尝试运行下面的代码段时Java 此代码块的并发修改异常,请提供帮助?,java,data-structures,arraylist,Java,Data Structures,Arraylist,missedMSRB是一个包含2187个元素的列表,当尝试运行下面的代码段时 List<List<String>> subList = getSubList(missedMSRB, 1000); for (List<String> subMSRB : subList) { StringBuffer sql = new StringBuffer(NamedQueries.msSQL); sql.append("(")
List<List<String>> subList = getSubList(missedMSRB, 1000);
for (List<String> subMSRB : subList) {
StringBuffer sql = new StringBuffer(NamedQueries.msSQL);
sql.append("(");
for (int i1 = 0; i1 < subMSRB.size(); i1++) { //Line 463 Throws Exception
if (i1 < subMSRB.size() - 1) {
sql.append("?,");
} else {
sql.append("? )");
}
} ....
下面的剩余代码
PreparedStatement psMSQL2 = msSQL.prepareStatement(sql.toString());
psMSQL2.setString(1, runDate);
psMSQL2.setString(2, runDate2);
int i = 3;
for (String s : subMSRB) {
psMSQL2.setString(i, s.trim());
i++;
}
ResultSet msSQL = psMSQL2.executeQuery();
logger.debug("SQL executed");
while (msSQL.next()) {
missedMSRB.remove(msSQL.getString(1));
}
getSubList impl//已更正
publicstaticlist getSubList(List-inputList,int-subListSize){
int listSize=inputList.size();
int=listSize/subListSize;
int remainingListSize=listSize%subListSize;
列表子列表=新的ArrayList();
for(int i=0;i
在getSubList
中,您可以使用inputList.subList
创建多个列表。在ArrayList
中实现的List
中的此方法不会创建新列表。相反,它返回一个inputList
视图,因此由inputList
支持
对inputList
的任何修改都会影响子列表。您已在asinputList
中通过了missedMSRB
,因此对missedMSRB
的任何修改都将影响子列表
因此,当您在外部for
循环中调用missedMSRB.remove
时,您将为子列表中的所有列表创建一个ConcurrentModification
。然后在子列表中检查其中一个列表的大小时,它抛出ConcurrentModificationException
为了解决这个问题,您可以创建一个新列表,而不是直接使用子列表的结果:
subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex)));
subList.add(新的ArrayList(inputList.subList(fromIndex,toIndex));
还有其他线程修改列表吗?是否有其他线程正在修改subMSRB
?(根据你的示例代码没有显示)除非我遗漏了什么,否则这里没有足够的信息来解释这个问题。如果在迭代过程中更改列表
,则会得到一个ConcurrentModificationException
。您可以发布更多代码吗?根据请求添加代码此missedMSRB。删除
更改missedMSRB
列表,该列表由subMSRB
使用,因为inputList。子列表
返回同一列表上的视图,而不是不同的列表。谢谢问题解决。更新了getSubList impl.)
public static List<List<String>> getSubList(List<String> inputList, int subListSize) {
int listSize = inputList.size();
int noOfLoops = listSize / subListSize;
int remainingListSize = listSize % subListSize;
List<List<String>> subList = new ArrayList<List<String>>();
for (int i = 0; i < noOfLoops; i++) {
int fromIndex = i * subListSize;
int toIndex = (fromIndex) + subListSize;
subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex)));
if ((remainingListSize != 0)
&& (toIndex == (listSize - remainingListSize))) {
subList.add(new ArrayList<String>(inputList.subList(toIndex, listSize)));
}
}
return subList;
}
subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex)));