这很奇怪:当我使用timer.scheduleAtFixedRate
启动计划时,需要很长时间然后抛出OutOfMemoryError: Java heap space
,但如果我刚刚在主线程中调用timerTask.run()
方法,它工作得很好。
我调用的方法不是开源的,所以我不能把它粘贴出去。但任何人都可以帮助我分析这种情况下的一些可能性。在timerTask线程中运行它并在主线程中运行它有什么区别?
非常感谢!
代码段如下所示:
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
AModule.load(tmpFilePath); //not open-source
}
}
timer.scheduleAtFixedRate(task, new Date(), 1*60*1000); //OOME
//If I change the upper code to:
task.run() //it just works fine
答案 0 :(得分:0)
AWT计时器在自己的线程中运行。 如果“主线程”是指UI线程或事件队列,则然后:
也许你的封闭源代码正在访问Swing。只能从事件线程访问Swing组件。在计时器中运行时可能会遇到问题,但在主线程中运行正常。
如果是这样的话你很幸运。从另一个线程调用Swing通常有效。在我演示或客户端尝试使用它之前,我从来没有遇到任何问题。问题往往不可重复。