public class StoreMessage extends Thread implements Serializable{
private static long start_nanotime=System.nanoTime();
private static int timeToRun = 60000;
private static byte[] b=null;
private static long startTime = System.currentTimeMillis();
private static long runUntilMillis = System.currentTimeMillis() + timeToRun;
public static Map <Long,Message> map1=new TreeMap<Long,Message>();
public static void store(Message message)throws Exception{
while (true) {
long now = System.currentTimeMillis();
if (now >= runUntilMillis) {
break;
}
long precise_time=TimeUnit.MILLISECONDS.toNanos(now)+(System.nanoTime()-start_nanotime);
map1.put(precise_time, message);
}
}
public static byte[] returning()throws Exception
{
b=serializer.serialize(map1);
System.out.println(b);
map1.clear();
return b;
}
}
我要做的是,将 StoreMessage 类每隔一分钟收到的所有消息对象存储到 TreeMap,序列化该 TreeMap 并将其返回给调用它的类,并在下一分钟创建/清除 TreeMap 以存储其他消息对象。
消息类的消息对象是 jms 文本消息,作为命令行参数输入。该store
方法在另一个类中调用,而该returning()
方法在另一个类中调用。两个类,当实例化和运行时,有多个参数,给我一个例外
java.util.ConcurrentModificationException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1100)
at java.util.TreeMap$EntryIterator.next(TreeMap.java:1136)
at java.util.TreeMap$EntryIterator.next(TreeMap.java:1131)
at java.util.TreeMap.writeObject(TreeMap.java:2250)
为什么?尤其是在我清理地图的时候。如果我只给出一个命令行参数,我不会得到这个例外。但是,如果一遍又一遍地遵守,我会得到同样的例外。
其次,我注意到,当收到消息对象时,它们被存储到 TreeMap 并序列化并返回。当我希望树形图将消息存储一分钟然后序列化整个消息时。