【问题标题】:How to relaunch a TimerTask如何重新启动 TimerTask
【发布时间】:2013-01-17 17:01:16
【问题描述】:

我编写了一个任务来通过套接字发送某个 TCP 消息。我有一个包含一堆消息和一些时间戳的文件,所以我将任务编程为 TimerTask,并使用带有第一个消息时间戳的 Timer 安排它。

当它完成时,任务运行方法结束,但它的关联线程仍然存在,它没有被取消。如果我尝试使用新时间重新安排任务,我会收到一个异常,告诉我无法重新安排已安排或取消的任务。

我也尝试在重新安排之前取消它,但显然,正如异常所说,它仍然是同样的问题。

我不能用固定的时间安排任务让它自己重复,因为每条消息都有时间而且不是固定的。

如何重新安排 TimerTask?顺便说一句,有没有什么方法可以等待任务结束,就像在套接字通信中,当它使用 ready 方法阻塞直到消息到达时一样?

【问题讨论】:

  • @pst 确实,如果我这样做,它会起作用。但正如我所指出的,即使在其 run 方法结束后,关联的线程仍然可以工作。这意味着,当发送了 100 条消息时,有 100 多个线程处于活动状态!我该如何解决?

标签: java timer timertask


【解决方案1】:

TimerTask 不是为重新调度而设计的,它是管理(单个)线程的 Timer。

使用 one Timermany new TimerTasks:

与每个Timer对象对应的是一个单个后台线程,用于依次执行定时器的所有任务..

在对 Timer 对象的最后一个实时引用消失并且所有未完成的任务都已完成执行后,定时器的任务执行线程[应该]优雅地终止(并成为垃圾回收的对象)。 p>

[来自每个schedule 方法:]

如果 [timerTask] 已被安排或取消,则抛出 IllegalStateException、定时器已取消或定时器线程终止。

如果单个 Timer 确实产生了许多线程,那么 将是一个不太可能的错误:确保确实只有一个 Timer 对象正在使用。

最后一个问题,关于如何将单个事件组合到工作流中,应该单独发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多