java - 为什么 Java Timer 线程消失了?

标签 java multithreading timertask

我有一些代码可以安排一次性任务的执行,并一遍又一遍地执行此操作。它看起来像这样。

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/

相关文章:

python 重用线程对象

java - 在JAVA循环中每x秒使用不同参数执行一个方法

java - java.util.stream.Collectors.toMap() 的值函数返回常量值

java - 有没有办法将任务放回执行程序队列中

java - 在 Android 中结束线程的正确方法

c++ - Class 对象上的多线程

java - 为游戏重新安排 TimerTask 'lobby'

android - 暂停计时器而不破坏和重新创建 - Android

java - Kafka - 如何模拟消费者记录?

java - Apache Wink 连接到 https 资源