我编写了一个通过套接字发送某条TCP消息的任务。我有一个包含大量消息和一些时间戳的文件,因此我将任务编程为TimerTask,并使用带有第一个消息时间戳的Timer安排它。
完成后,任务运行方法结束,但其关联的线程仍然存在,它不会被取消。如果我尝试用新的时间重新安排任务,我会得到一个例外,告诉我我不能重新安排一个调整或取消的任务。
我还试过在重新安排之前取消它,但显然,正如例外所述,它仍然是同样的问题。
我无法使用常量perior安排任务让它重复自己,因为每条消息都有一个时间而且不是常数。
如何重新安排TimerTask?顺便说一下,有没有什么方法可以等待任务结束,就像套接字通信一样,当它用就绪方法阻塞,直到消息到达为止?
答案 0 :(得分:1)
TimerTask不是为重新安排而设计的,它是管理(单个)线程的Timer。
使用一个 Timer和许多 new
TimerTasks:
对应每个Timer对象的是一个单个后台线程,用于按顺序执行所有计时器的任务。
在最后一次对Timer对象的实时引用消失并且所有未完成的任务都已完成执行之后,计时器的任务执行线程[应该]正常终止(并且变为垃圾回收)。
[来自schedule个方法:]
如果[TimerTask]已经安排或取消,计时器被取消或计时器线程终止,则抛出IllegalStateException。
如果确实有多个线程由一个Timer产生,那么将成为一个不太可能发生的错误:确保实际上只有一个Timer对象被使用。
关于如何将个别事件组合成工作流的最后一个问题应该是一个单独的帖子。