关于这段代码,我有两个问题:
import java.util.*;
public class TestClass {
private static List<String> list;
public static void main(String[] argv) {
list = generateStringList(new Random(), "qwertyuioasdfghjklzxcvbnmPOIUYTREWQLKJHGFDSAMNBVCXZ1232456789", 50, 1000);
// Collections.sort(list, new Comparator<String>() {
// public int compare(String f1, String f2) {
// return -f1.compareTo(f2);
// }
// });
for (int i = 0; i < 500; i++) {
new MyThread(i).start();
}
}
private static class MyThread extends Thread {
int id;
MyThread(int id) { this.id = id; }
public void run() {
Collections.sort(list, new Comparator<String>() {
public int compare(String f1, String f2) {
return -f1.compareTo(f2);
}
});
for (Iterator it = list.iterator(); it.hasNext();) {
String s = (String) it.next();
try {
Thread.sleep(10 + (int)(Math.random()*100));
}catch (Exception e) { e.printStackTrace(); }
System.out.println(id+" -> "+s);
}
}
}
public static List<String> generateStringList(Random rng, String characters, int length, int size)
{
List<String> list = new ArrayList<String>();
for (int j = 0; j < size; j++) {
char[] text = new char[length];
for (int i = 0; i < length; i++)
{
text[i] = characters.charAt(rng.nextInt(characters.length()));
}
list.add(new String(text));
}
return list;
}
}
在java 1.8.0_45上运行这段代码,我得到了java.util.ConcurrentModificationException
。
1)如果我在thread.start之前解排序,为什么我也会得到异常?
2)为什么只在java 1.8.0_45上得到异常?在1.6.0_45,1.7.0_79,1.8.0_5上它都运行得很好。
发布于 2015-09-22 22:06:11
你会得到这个异常,因为你有不同的线程同时修改和迭代列表。
注释掉的排序不是导致问题的原因。CME是由线程内部的排序和迭代引起的。因为你有多个线程排序和迭代,所以你得到了一个CME。这与Java版本无关。
看起来您的线程不需要修改列表,所以您可以在创建线程的循环之前执行一次排序,然后从线程中删除if。
https://stackoverflow.com/questions/32718852
复制相似问题