1

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

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

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

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

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

4

1 回答 1

1

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

使用一个 Timer多个 newTimerTask:

与每个 Timer 对象对应的是一个单独的后台线程,用于按顺序执行计时器的所有任务。

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

[从每个调度方法:]

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

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

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

于 2013-01-17T17:14:51.273 回答