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

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

Timer timer = new Timer();
timer.schedule(new MyTimerTask(), theDate, Integer.parseInt(interval) * 60 * 1000);

11 个解决方案

#1


MyTimerTask的实现贴出来看一下

#2


Integer.parseInt(String)可能抛出异常,检查问题会出在这吗?

#3


引用 1 楼 sasuke38 的回复:
MyTimerTask的实现贴出来看一下

实现的代码很长,不全部贴了,错误已捕获处理,.......


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

    public void run() {
        try {
            .......
        } catch (Exception ae) {
            logger.error(ae.getMessage());
        }
    }
}

#4


引用 2 楼 lfp001 的回复:
Integer.parseInt(String)可能抛出异常,检查问题会出在这吗?


这个,在前面已检查,确保正确了...........

#5


系统时间若有改变,timer就会挂掉

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

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

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

#6


引用
我用过多次TimerTask也没遇到过啊。建议用timer.scheduleAtFixedRate(...);至于为什么。。LZ可以自己去看看资料。。

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

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

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

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


如果大概知道是哪段代码有问题。。那就不用分析了。。直接改bug。。。

#7


debug是很好做的了 做起来比较有成就感 因为从来都可以找到错误原因

#8


引用 5 楼 ticmy 的回复:
系统时间若有改变,timer就会挂掉

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

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

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


试过了,spring+quatrz也试过了,都一样.............

#9


引用 6 楼 kouyisc 的回复:
还有挂死 是卡住不动了?还是直接报错溢出了?还是别的情况。。。?

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


是卡住不动了,看来只有试试MemoryAnalyzer了,学习看看怎么用吧.........

#10


最后还是自己解决了:
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), theDate, Integer.parseInt(interval) * 60 * 1000);

这个MyTimerTask()里启动了20多个线程,照理说每个线程执行完成后,MyTimerTask也就结束了,实际情况是每个线程,都要对远程机器上的数据库进行连接,取数,结果,就有个别线程挂死了,时间长了,程序就崩溃了。对MyTimerTask进行改进,在线程正常运行需要的时间后,检测线程是否完成,如果没有完成,就强制终止线程。这样运行一段时间观察,一切都正常了。

#11


引用 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)

这是最近从日志文件中抛出的异常信息

#1


MyTimerTask的实现贴出来看一下

#2


Integer.parseInt(String)可能抛出异常,检查问题会出在这吗?

#3


引用 1 楼 sasuke38 的回复:
MyTimerTask的实现贴出来看一下

实现的代码很长,不全部贴了,错误已捕获处理,.......


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

    public void run() {
        try {
            .......
        } catch (Exception ae) {
            logger.error(ae.getMessage());
        }
    }
}

#4


引用 2 楼 lfp001 的回复:
Integer.parseInt(String)可能抛出异常,检查问题会出在这吗?


这个,在前面已检查,确保正确了...........

#5


系统时间若有改变,timer就会挂掉

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

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

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

#6


引用
我用过多次TimerTask也没遇到过啊。建议用timer.scheduleAtFixedRate(...);至于为什么。。LZ可以自己去看看资料。。

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

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

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

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


如果大概知道是哪段代码有问题。。那就不用分析了。。直接改bug。。。

#7


debug是很好做的了 做起来比较有成就感 因为从来都可以找到错误原因

#8


引用 5 楼 ticmy 的回复:
系统时间若有改变,timer就会挂掉

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

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

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


试过了,spring+quatrz也试过了,都一样.............

#9


引用 6 楼 kouyisc 的回复:
还有挂死 是卡住不动了?还是直接报错溢出了?还是别的情况。。。?

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


是卡住不动了,看来只有试试MemoryAnalyzer了,学习看看怎么用吧.........

#10


最后还是自己解决了:
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), theDate, Integer.parseInt(interval) * 60 * 1000);

这个MyTimerTask()里启动了20多个线程,照理说每个线程执行完成后,MyTimerTask也就结束了,实际情况是每个线程,都要对远程机器上的数据库进行连接,取数,结果,就有个别线程挂死了,时间长了,程序就崩溃了。对MyTimerTask进行改进,在线程正常运行需要的时间后,检测线程是否完成,如果没有完成,就强制终止线程。这样运行一段时间观察,一切都正常了。

#11


引用 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)

这是最近从日志文件中抛出的异常信息