我编写了一个任务,通过套接字发送某些TCP消息。我有一个包含一堆消息和一些时间戳的文件,因此我将该任务编程为TimerTask,并使用带有第一个消息时间戳的Timer对其进行了调度。
完成后,任务运行方法结束,但其关联的线程仍然存在,不会被取消。如果我尝试使用新的时间重新安排任务,则会收到异常消息,通知我无法重新安排已安排的任务或取消的任务。
在重新计划之前,我也尝试过使用cancellig,但是显然,正如异常所指出的,它仍然是相同的问题。
我不能为任务安排一个固定的期限来让它重复执行,因为每条消息都有一个时间,并且它不是恒定的。
如何重新安排TimerTask?顺便说一句,有什么方法可以等待任务结束,就像套接字通信中以就绪方法阻塞直到消息到达一样吗?
TimerTask并非旨在进行重新安排,而是由Timer管理(单个)线程。
使用 一个 Timer和 许多 new TimerTasks:
new
与每个Timer对象相对应的是 单个后台线程 ,该 线程 用于按顺序执行所有计时器的任务。 在最后一个对Timer对象的实时引用消失并且所有未完成的任务已完成执行之后, 计时器的任务执行线程[应该]优雅地终止 (并接受垃圾回收)。 [从每个计划方法:] 如果已经计划 或取消了 [TimerTask], 取消了计时器或终止了计时器线程, 则抛出IllegalStateException 。
与每个Timer对象相对应的是 单个后台线程 ,该 线程 用于按顺序执行所有计时器的任务。
在最后一个对Timer对象的实时引用消失并且所有未完成的任务已完成执行之后, 计时器的任务执行线程[应该]优雅地终止 (并接受垃圾回收)。
[从每个计划方法:]
如果已经计划 或取消了 [TimerTask], 取消了计时器或终止了计时器线程, 则抛出IllegalStateException 。
如果单个Timer确实产生了许多线程,那么这 将 是一个不可能发生的错误:请确保确实只使用了一个Timer对象。
关于如何将单个事件组合到工作流中的最后一个问题应该是单独的帖子。