timer.schedule运行一定时间后挂死.....

wula0010 2011-12-14 06:22:13
程序代码如下,程序运行没有问题,MyTimerTask()有日志输出。但是发现程序运行一段时间后挂死,即根据日志发现:没有运行新的timer.schedule任务,程序界面没有变化,也没有报错退出,如何解决?

Timer timer = new Timer();
timer.schedule(new MyTimerTask(), theDate, Integer.parseInt(interval) * 60 * 1000);
...全文
1008 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
幽丨殇 2014-08-25
  • 打赏
  • 举报
回复
引用 10 楼 wula0010 的回复:
最后还是自己解决了: Timer timer = new Timer(); timer.schedule(new MyTimerTask(), theDate, Integer.parseInt(interval) * 60 * 1000); 这个MyTimerTask()里启动了20多个线程,照理说每个线程执行完成后,MyTimerTask也就结束了,实际情况是每个线程,都要对远程机器上的数据库进行连接,取数,结果,就有个别线程挂死了,时间长了,程序就崩溃了。对MyTimerTask进行改进,在线程正常运行需要的时间后,检测线程是否完成,如果没有完成,就强制终止线程。这样运行一段时间观察,一切都正常了。
楼主,我也是跟你一样要定时对远程机器进行连接取值,然后启动一段时间后,会报错说连接关闭,求楼主帮忙. 错误1:java.io.IOException: Sorry, this connection is closed. 错误2:java.io.IOException: Could not open channel (The connection is being shutdown) 这是最近从日志文件中抛出的异常信息
wula0010 2011-12-31
  • 打赏
  • 举报
回复
最后还是自己解决了:
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), theDate, Integer.parseInt(interval) * 60 * 1000);

这个MyTimerTask()里启动了20多个线程,照理说每个线程执行完成后,MyTimerTask也就结束了,实际情况是每个线程,都要对远程机器上的数据库进行连接,取数,结果,就有个别线程挂死了,时间长了,程序就崩溃了。对MyTimerTask进行改进,在线程正常运行需要的时间后,检测线程是否完成,如果没有完成,就强制终止线程。这样运行一段时间观察,一切都正常了。
wula0010 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kouyisc 的回复:]
还有挂死 是卡住不动了?还是直接报错溢出了?还是别的情况。。。?

如果卡住或者溢出,只能用MemoryAnalyzer工具分析哪里的原因。。就像debu……
[/Quote]

是卡住不动了,看来只有试试MemoryAnalyzer了,学习看看怎么用吧.........
wula0010 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ticmy 的回复:]
系统时间若有改变,timer就会挂掉

异常你捕获了,应该问题不在这

强烈建议换成ScheduledExecutorService executorService = Executors.newScheduledThreadPool(size);

用这个来调度,就不会有timer的乱七八糟的问题
[/Quote]

试过了,spring+quatrz也试过了,都一样.............
wula0010 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lfp001 的回复:]
Integer.parseInt(String)可能抛出异常,检查问题会出在这吗?
[/Quote]

这个,在前面已检查,确保正确了...........
wula0010 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sasuke38 的回复:]
MyTimerTask的实现贴出来看一下
[/Quote]
实现的代码很长,不全部贴了,错误已捕获处理,.......


public class MyTimerTask extends TimerTask {
static Logger logger = Logger.getLogger(MyTimerTask.class);

public void run() {
try {
.......
} catch (Exception ae) {
logger.error(ae.getMessage());
}
}
}
Jobernowl 2011-12-15
  • 打赏
  • 举报
回复
debug是很好做的了 做起来比较有成就感 因为从来都可以找到错误原因
kouyiSC 2011-12-15
  • 打赏
  • 举报
回复
引用
我用过多次TimerTask也没遇到过啊。建议用timer.scheduleAtFixedRate(...);至于为什么。。LZ可以自己去看看资料。。

还有。再看看程序哪里没有关闭IO,或者链接。。或者大数据的处理。。。

还有挂死 是卡住不动了?还是直接报错溢出了?还是别的情况。。。?

如果卡住或者溢出,只能用MemoryAnalyzer工具分析哪里的原因。。就像debug更容易发现问题一样。。。

将卡住的程序。。cmd下达成一个bin包。。导入工具分析。。。有包或者类或者对象的内存占用情况。。


如果大概知道是哪段代码有问题。。那就不用分析了。。直接改bug。。。
龙四 2011-12-15
  • 打赏
  • 举报
回复
系统时间若有改变,timer就会挂掉

异常你捕获了,应该问题不在这

强烈建议换成ScheduledExecutorService executorService = Executors.newScheduledThreadPool(size);

用这个来调度,就不会有timer的乱七八糟的问题
lfp001 2011-12-14
  • 打赏
  • 举报
回复
Integer.parseInt(String)可能抛出异常,检查问题会出在这吗?
Jobernowl 2011-12-14
  • 打赏
  • 举报
回复
MyTimerTask的实现贴出来看一下

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧