我的记录器类中的计时器有问题。我创建了自己的记录器,它应该尽可能简单——用户只能调用静态 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/