当前位置: 首页 > 面试题库 >

如何重新启动TimerTask

郭俊人
2023-03-14
问题内容

我编写了一个任务,通过套接字发送某些TCP消息。我有一个包含一堆消息和一些时间戳的文件,因此我将该任务编程为TimerTask,并使用带有第一个消息时间戳的Timer对其进行了调度。

完成后,任务运行方法结束,但其关联的线程仍然存在,不会被取消。如果我尝试使用新的时间重新安排任务,则会收到异常消息,通知我无法重新安排已安排的任务或取消的任务。

在重新计划之前,我也尝试过使用cancellig,但是显然,正如异常所指出的,它仍然是相同的问题。

我不能为任务安排一个固定的期限来让它重复执行,因为每条消息都有一个时间,并且它不是恒定的。

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


问题答案:

TimerTask并非旨在进行重新安排,而是由Timer管理(单个)线程。

使用 一个
Timer和 许多
new TimerTasks:

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

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

[从每个计划方法:]

如果已经计划 或取消了 [TimerTask], 取消了计时器或终止了计时器线程, 则抛出IllegalStateException

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

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



 类似资料:
  • 问题内容: 我试图编写一个文件监视器,它将检查文件是否添加了新行,该监视器实际上是一个线程,它将始终由randomaccessfile读取该行。 这是监视器的核心代码: 这是一些帮助类: 这是调用监视器的示例: 现在,我的问题是,如果我仅调用以下代码,代码就可以很好地工作: 这将监视文件的行追加,并通知侦听器。 但是,当我致电: 这意味着我想监视另一个文件而不是之前。 因此,在Monitor中,我

  • 问题内容: 我有一个静态课程(Foo)和一个主课程(Main) 参见Main.java: 参见Foo.java: 有什么方法可以重新启动或重置静态类? 注意:我需要这样做是因为我正在用jUnit测试静态类,并且需要在第二次测试之前清除参数。 编辑 几乎解决方案: 使用StanMax答案,我可以这样做: Main.java MyClassLoader.java Foo.java 输出值 问题:如果我

  • 我成功地使用了BenjaminRH的jQuery-ticker。它在提示字段提交后被激发,但是一旦ticker运行了一次并且需要再次被激发,它就不被激发了。 该报价器以以下方式启动 我试图用 没有成功。帮助是非常宝贵的。多谢了。

  • 问题内容: 运行需要终端I输入的程序,可以通过Ctrl + D“关闭” stdin。之后有什么办法可以重新打开标准输入? 问题答案: 通常在linux和POSIXy系统上,当您在终端中按+ 时,标准输入描述符不会关闭。它只是使伪终端层变得可读,并返回0。这就是POSIXy系统指示输入结束的方式。 这并不意味着文件描述符(甚至C库在其顶部提供的流句柄)都已关闭。正如史蒂夫·萨米特(Steve Sum

  • 问题内容: 我以前在Android Studio上开发过Android应用程序。一切正常。 我在真实设备上工作,Android Studio可以毫无问题地识别它。 突然,当我退出android studio并断开连接并重新连接设备时,它不再识别我的设备,我必须退出并重新启动Android Studio。 我找不到像Android Studio这样的“重置adb”方法。 我按照下面的说明(工具->

  • 问题内容: 您如何使python程序自动重新启动?因此,假设有一个非常简单的程序,例如: 现在,在Python Shell中,您将必须按“运行”按钮,然后按“运行模块(F5)”,或者仅按键盘上的“ f5”按钮。那是您第一次运行它。程序结束后,您将返回到“ Cheese.py”文件,然后按“ f5”再次运行该程序。大家和我在一起吗?好的,所以我的问题是,如何使程序自动重新启动,而无需手动执行? 问题