【问题标题】:serializing a tree map after every one minute using threads每一分钟使用线程序列化一个树形图
【发布时间】:2012-04-02 09:44:52
【问题描述】:

我正在尝试将在一分钟内获得的类 Message 的所有对象存储到树形图中,并将其精确时间作为键。一分钟完成后,我试图中断线程并将映射序列化为 @ 987654321@ 到我要返回到调用类的字节[]。

    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);
                            } 

                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;
  }
}   

为什么这段代码不起作用?
它给了我Exception in thread "Thread-4" java.lang.OutOfMemoryError: Java heap space

【问题讨论】:

    标签: java multithreading time treemap


    【解决方案1】:

    这段代码意义不大:

    1. 为什么你要扩展 Thread 并在封闭类中实现 Serializable 没有明显的原因?
    2. 为什么你的线程在完成睡眠后会中断父进程?在我看来,您正在做一个非常复杂的控制流操作。

    我建议一种更简单的方法,使用ScheduledThreadPoolExecutor 每分钟运行一次序列化任务,同时主线程不断用新消息更新地图。

    经过一番研究,我明白了你的程序是如何工作的,但是很难理解控制是如何流动的。

    【讨论】:

    • 你能帮忙吗...我被卡住了
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多