我有一些代码可以安排一次性任务的执行,并一遍又一遍地执行此操作。它看起来像这样。
public static void main(String[] args)
{
while(true)
{
....
TimerTask closeTask = new CloseTask(cli);
Timer timer = new Timer(true);
timer.schedule(closeTask, (long) (iPeriod * 60 * 1000));
...
}
}
public class CloseTask extends TimerTask
{
Client client;
CloseTask(Client in_client)
{
client = in_client;
}
public void run()
{
try
{
for(int iRetries = 0; state == OPEN; iRetries++)
{
logger.log_trade_line_grablock( "Thread " + Thread.currentThread().getId() + ": About to send message", true, true, true, true, true);
client.send_mesg("close");
logger.log_trade_line_grablock( "Waiting 5 seconds before retrying ", true, true, true, true, true);
Thread.sleep(5000);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
run()
的意图CloseTask
中的方法类将循环直到 state
变量从 OPEN
更改陈述其他事物。然而,计时器线程会间歇性地消失,而 state
仍然等于 OPEN
,我通过每 5 分钟打印出当前正在运行的线程的所有线程 ID 来了解这一点。
所以我的问题是:
1)我能想到的唯一解释是 CloseTask
对象抛出未捕获的异常。那是对的吗?
2)如果1)是正确的,为什么我的try catch block 没有捕获这些异常?
3)如果1)是正确的,有没有办法捕获这些未捕获的异常?
感谢您对此问题的任何见解。
最佳答案
您正在创建一个 Timer
实例,但不确定它不会被垃圾回收。
来自documentation :
After the last live reference to a Timer object goes away and all outstanding tasks have completed execution, the timer's task execution thread terminates gracefully (and becomes subject to garbage collection).
所以基本上,您需要保留对您创建的 Timer
的引用,而不仅仅是使用局部变量。
关于java - 为什么 Java Timer 线程消失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27626744/