Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中循环一定的时间和任务_Java_Loops - Fatal编程技术网

在java中循环一定的时间和任务

在java中循环一定的时间和任务,java,loops,Java,Loops,我有如下要求 loop(N times) { for(1 minute) { write certain values to a tree map } for(exactly after that above 1 min task) { serialize the tree map return the tree map create a new tree map } } 我如何做到这一点 这就是我到目前为止所做的 public class StoreMessage { pr

我有如下要求

loop(N times)
{
for(1 minute)
{
 write certain values to a tree map
}
for(exactly after that above 1 min task)
{
 serialize the tree map
 return the tree map
 create a new tree map
}
}
我如何做到这一点

这就是我到目前为止所做的

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;
     }
}  
公共类存储消息{
private static long start_nanotime=System.nanotime();
私有静态线程thisThread=Thread.currentThread();
私有静态int timeToRun=60000;//1分钟
私有静态字节[]b=null;
公共静态映射map1=新树映射();
公共静态字节[]存储(消息){
新线程(newrunnable()){
公开募捐{
试一试{
睡眠(timeToRun);
thisThread.interrupt();
b=序列化程序。序列化(map1);
新树映射();
}捕获(例外e){
e、 printStackTrace();
}
}
}).start();
而(!Thread.interrupted()){
long precision_time=TimeUnit.millises.toNanos(System.currentTimeMillis())+(System.nanoTime()-start_nanoTime);
map1.put(精确时间、消息);
}
返回b;
}
}  
我试图将在一分钟内收到的类消息的所有JMS对象存储到树映射中,并将其精确时间作为键。在完成一分钟后,我希望序列化映射并将字节[]返回给另一个类。同时,我创建了一个新的树映射来存储下一组JMS消息一分钟
这段代码有些不起作用。它给我的错误是java.lang.OutOfMemoryError:java堆空间。我还注意到,它一直只在地图上写一条消息,即如果消息是“嗨”,“你好”——这是两条jms消息;StoreMessage类一次接收一条消息。即,它将首先接收“hi”,一旦处理此消息,它将检索下一条消息。但我注意到的是,在整整一分钟内,当线程没有中断时,它只将第一条消息写入映射,并给出一个错误。如何解决这些问题?

要解决此问题,您需要使用日期类型

要改进日期类型,可以使用、或简单的算术

新建日期()
-为当前时刻创建日期实例

Date date1 = new Date();
Thread.sleep(4000); //Do nothing for 4 sec
Date date2 = new Date(); 

long timeDiffInMs = date2.getTime() - date1.getTime();

timeDiffInMs的值应小于等于4秒

所以我不确定您在代码中想要实现什么,但我想我至少应该给出一些反馈

首先,您的内存不足,因为您正在进行自旋循环调用:

map1.put(precise_time, message);
这将很快填满内存。现代计算机的速度足够快,每秒至少可以创建一百万个树元素。您需要以某种方式限制所拨打的
put
电话的数量

接下来,分叉线程是非常奇怪的,这样您可以在以后
interrupt()
父线程。相反,我会像下面这样做,在时间毫秒值处设置一个停止点,然后运行直到到达时间。这将完全消除
线程

long runUntilMillis = System.currentTimeMillis() + timeToRunMillis;
while (true) {
    long now = System.currentTimeMillis();
    if (now >= runUntilMillis) {
       break;
    }
    long precise_time = ...
    map1.put(precise_time, message);
}
return serializer.serialize(map1);
其他一些想法:

  • 您的
    精确时间计算不正确。您不能获取自epoch以来的毫秒数并将其添加到
    System
    nano second值中。如果我没有弄错的话,您很可能会溢出
    长的
    。事实上,纳秒的计算结果应该是负值,所以我不确定你想做什么。我只需要使用
    start\u nanotime-System.nanotime()
  • 不能执行
    b=serializer.serialize(map1)线程中的code>。这甚至不会编译,因为
    b
    必须在线程内部定义,或者是
    final
  • 我不懂这类的
    newtreemap()线程
    中的code>,它只会创建一个
    树映射
    ,该树映射会立即标记为垃圾,因为您没有将其分配给任何人。也许你想使用
    map1.clear()
  • 您正在将相同的
    消息
    值放入
    树映射
    中的每个元素中。我不确定这是你想要的

通过读取第一个?一分钟是60秒。所以当时间差小于60秒时。做一些操作。至少先写一些Java,这只是伪代码,所以可以说甚至不是Java问题。嗨,格雷!谢谢你的回复。。这段代码没有给我任何错误,但也没有给我任何输出。。请帮帮我!对不起,库克斯。哪种代码?我的密码?你希望得到什么样的输出?你好,格雷!好的,如果这段代码能够正常工作,它应该将字节[]返回给调用它的另一个类。该类应该将这个字节[]写入HDF5数据库的不透明数据集,并创建一个扩展名为h5的文件。我确信调用类中没有错误,因为我已经执行了很多次了。。这个类代码基本上是用来连接我的JMS结构和HDF5数据库的。格雷,帮帮我,我非常需要它!恐怕你现在只能靠自己了。如果你想问另一个关于这些东西的问题,那好吧。希望我的回答有帮助。