在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数据库的。格雷,帮帮我,我非常需要它!恐怕你现在只能靠自己了。如果你想问另一个关于这些东西的问题,那好吧。希望我的回答有帮助。