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;
}
}
は、すべて私のメッセージは、TreeMapのに一分ごとにクラスStoreMessageで受信されたオブジェクトストアで、TreeMapのクラスの呼び出し元に戻すことをシリアライズ他のメッセージオブジェクトを格納する次の分のTreeMapを作成/クリアします。
メッセージクラスのメッセージオブジェクトは、コマンドライン引数として入力されるjmsテキストメッセージです。 store
メソッドは別のクラスで呼び出され、returning
メソッドは別のクラスで呼び出されます。両方のクラスは、インスタンス化およびJavaでjava.util.TreeMapの$ PrivateEntryIterator.nextEntry(TreeMap.java:1100) でjava.util.ConcurrentModificationExceptionが 私に例外java.util.ConcurrentModificationExceptionが
を与え、複数の引数を指定して、実行します.util.TreeMap $ EntryIterator.next(TreeMap.java:1136) at java.util.TreeMap $ EntryIterator.next(TreeMap.java:1131) at java.util.TreeMap.writeObject(TreeMap.java:2250)
なぜですか?特に、私は地図をクリアしています。コマンドライン引数を1つだけ指定している場合、この例外は発生しません。しかしそれが何度も遵守されるならば、私は同じ例外を受ける。
2つ目は、受信したメッセージオブジェクトがTreeMapに格納されてシリアライズされて返されることに気付きました。とき私は1分のメッセージを格納し、その後、全体のロットをシリアル化するツリーマップをしたい。
public static Map <Long,Message> map1 =
Collections.synchronizedMap(new TreeMap<Long,Message>());
をごMapインスタンスを同期させるために:
http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html? – claesv