我试图在一分钟内将收到的消息类的所有JMS对象存储到树映射中,而不是作为键的精确时间。完成一分钟后,我希望序列化映射并将byte []返回给另一堂课。同时我创建了一个新的树映射来存储下一组JMS消息一分钟。
public class StoreMessage {
private static long start_nanotime = System.nanoTime();
private static Thread thisThread = Thread.currentThread();
private static int timeToRun = 60000; // 1 minute
private static byte[] b = null;
public static Map<Long, Message> map1 = new TreeMap<Long, Message>();
public static byte[] store(Message message) {
new Thread(new Runnable() {
public void run() {
try {
sleep(timeToRun);
thisThread.interrupt();
b = serializer.serialize(map1);
new TreeMap<Long, Message>();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
while (!Thread.interrupted()) {
long precise_time = TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()) + (System.nanoTime()
- start_nanotime);
map1.put(precise_time, message);
}
return b;
}
}
这段代码是如何不工作的。为什么?它给了我 java.lang.OutOfMemoryError:Java堆空间的错误。我还注意到它只向地图写了一条消息,即如果消息是“hi”,“祝你好运“ - 这是两条消息; StoreMessage类一次收到一条消息..它首先收到“hi”,一旦处理完这条消息,它就会检索下一条消息。但我注意到,一分钟,当线程没有被中断时,它只将第一条消息写入地图并给出错误。我该如何解决这些问题?
答案 0 :(得分:0)
问题是您的 map1 从未实际重置,因为分配失踪。
public void run() {
try {
sleep(timeToRun);
thisThread.interrupt();
b = serializer.serialize(map1);
map1 = new TreeMap<Long, Message>(); // Changed this line
} catch (Exception e) {
e.printStackTrace();
}
}
当然,你也可以简单地清除地图:
map1.clear();