java - 取消定时器

标签 java android timer

我的记录器类中的计时器有问题。我创建了自己的记录器,它应该尽可能简单——用户只能调用静态 log() 方法。每次调用 log() 方法都会导致将日志对象(消息、时间、附加信息)添加到日志列表中。
当用户第一次调用此方法时,记录器还会启动一个新的计时器,每 30 秒将列表中的所有日志保存到一个文件中。

但是,我不知道在哪里调用 timer.cancel() 方法。我不想强制用户在他的代码中这样做。是否有必要总是取消定时器?或者这种方法只是在用户需要时停止。

最佳答案

但是在这种情况下你根本不需要关闭钩子(Hook)。当 VM 关闭时,所有线程都会被取消,所有打开的文件都会被关闭,所以不用担心。

我相信你想要的是避免任务每 30 秒连续唤醒一次,即使应用程序没有做任何事情也是如此。我建议做一些不同的事情:

每当你在 log 方法中记录一些东西时:

  • 存储日志条目
  • 检查您是否有等待执行的计时器任务(一个 boolean volatile “taskRunning”标志)。如果不是 - 延迟 30 秒触发任务,但仅触发一次(不重复)并将 taskRunning 标志设置为 true。如果标志设置为 true - 什么都不做。
  • 在您的计时器任务中:清除“taskRunning”标志,写入到目前为止存储的所有日志,并且...不要启动另一个任务。没必要。每当有人写入日志文件时,它将启动另一个任务,该任务将在 30 秒后写入日志。

注意。为了避免竞争,您还需要对日志读/写进行一些同步。

关于java - 取消定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6556613/

相关文章:

java - netty-socketio 读取socket.io 数据吗?

Android 解析主机

android - 用 jquery mobile 替换 jqtouch

Android:跟踪有问题的设备

JavaScript setInterval 仅运行一次

java - 如何安排任务定期运行?

javascript - 如何防止使用GWT乱添加控件?

java - org.h2.jdbc.JdbcSQLException : Column "Id" not found during testing with H2 Database

java - 使用 Java 解码来自 WebSocket 的 "send"消息

c# - asp.net 计时器和 response.redirect