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
方法。這兩個類,實例化和運行,有多個參數的時候,給我一個例外TreeMap中的java.util.ConcurrentModificationException
java.util.ConcurrentModificationException 在java.util.TreeMap中的$ PrivateEntryIterator.nextEntry(TreeMap.java:1100) 是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中並被序列化並返回。當我想要樹形圖存儲消息一分鐘,然後序列化整個批次。
你看過http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html? – claesv 2012-04-05 08:19:30