确保方法仅在x秒内每次输入调用一次

时间:2015-03-13 10:52:26

标签: java

我有一个方法,我需要确保在每个输入的时间范围内只运行一次。例如,方法是;

void performAction(String input);

当前实现阻止任何输入的x秒方法;

int timeOut = 0;
void performAction(String input) {
     if (hasBeenUsed()) return;
     //carryout task
}

private boolean hasCallDelay() {
   long currentTime = System.currentTimeMillis();

   if ((currentTime - timeOut) < TIME_DELAY) return true;
   timeOut = currentTime;

   return false;
}

这适用于单个方法调用,是否有一种优雅的方式只能为同一个输入超时?因此,如果输入“HELLO”,它会忽略x时间才能再次与“HELLO”通话。

我想也许某种数据结构可以在一段时间后删除条目。此外,现在只能从一个线程调用,但我猜测上面的解决方案不适用于多个线程。

这是一个运行的本地服务,有一些客户端可以连接到它并调用该方法。问题是用户可以双击UI并最终调用任务两次,我可以在UI上修复此问题但是我需要确保所有未来的客户端也这样做,所以宁愿在服务上停止它

2 个答案:

答案 0 :(得分:3)

你可以尝试Guaua缓存基于时间的驱逐;简而言之,您可以配置缓存条目以在配置的间隔后自动删除。 您的代码应处理输入,当且仅当它在缓存中不可用时,并且在开始执行代码之前,您可以确保将该条目添加到缓存中。

https://code.google.com/p/guava-libraries/wiki/CachesExplained

答案 1 :(得分:2)

  • 使用地图记下输入与方法调用的时间
  • 下次调用输入时,请从地图中检查上一个通话时间。
  • 如果超出时间范围,请调用方法
  • 否则,只是忽略说任何抛出异常的sysout语句。
  • 如果时间范围是c =超出,请使用新的通话时间重置地图中的值并调用该功能..

玩得开心.. :)