【问题标题】:How do I check how many events are happening within 2 seconds? (timer)如何检查 2 秒内发生了多少事件? (定时器)
【发布时间】:2013-03-29 23:06:49
【问题描述】:

我需要检查在 2 秒内检测到多少事件。我的计时器在工作,其他一切都在工作......但我遇到了一个问题:循环每秒只检查一次,我似乎无法弄清楚如何解决这个问题。我需要它在这两秒钟内不断检查,看看总共有多少事件!

这是我所拥有的:

int seconds = 0;
System.out.println("Seconds: " + seconds);
while(seconds < 2)
{
    //Wait 1 second
    try {                                
        Thread.sleep(1000);
    }
    catch(Exception e) {}

    seconds++;
    System.out.println("Seconds: " + seconds);

    //This needs to be looping the whole time. 
    //But right now, it's being blocked and only checked once
    if(eventDetected() && seconds <= 2){
        events++;
    } 
}

所以你可以看到我的问题。我不能把它们分开,因为第二个计时器会运行,然后会检查 eventDetected()。我需要它在两秒计时器期间不断检查......所以我基本上需要两件事同时发生。有什么办法可以做到吗?

感谢您提前提供的任何帮助!

【问题讨论】:

    标签: java android multithreading loops timer


    【解决方案1】:

    我认为您的设计模式需要改进——我不知道您要检测什么类型的事件,但无论您的睡眠时间有多短,使用当前模式您都有可能错过某个事件。这是我的建议:

    eventDetected() 增加您的events 计数器。这样,您就不会错过任何活动。

    然后,您只需要一种打开和关闭监听的方法(也许还需要重置事件计数器)。如果您确定在当前模式中您确实处于不会阻止您的 eventDetected() 方法的不同线程中,您可以设置一个标志来检查。例如:

    当您想开始收听时:

    listenForEvents = true;

    在 eventDetected() 中:

    if (listenForEvents) { events++; }

    当您想停止收听时(例如,在您拨打Thread.sleep() 之后):

    listenForEvents = false;
    

    当然,对于多线程,请务必注意检查和设置变量的并发问题。

    【讨论】:

      【解决方案2】:

      我会告诉你我必须跟踪什么样的事件,但我必须杀了你:D

      回答了我自己的问题。希望这将帮助其他在某些时候遇到类似问题的人!我查了一下多线程...

      我创建了一个新的 EventTimer 类,它实现了 Runnable,有一个公共字段秒:

      public class EventTimer implements Runnable{
      int seconds;
      static int timerThreadCount = 0;
      Thread t;
      
      public EventTimer() {
          timerThreadCount++;
          this.seconds = 0;
          t = new Thread(this, "Event Timer");
          t.start(); // Start the thread
      }
      
      @Override
      public void run() {
          // TODO Auto-generated method stub
          while(seconds < 2)
          {
              //Wait 1 second
              try {                                
                  Thread.sleep(1000);
              }
              catch(Exception e) {
                  System.out.println("Waiting interupted.");
              }
      
              seconds++;
              System.out.println("Seconds: " + seconds);
          }
      }
      
      }
      

      然后我使用了 EventTimer 的一个实例,并使用了一个 while 循环和 if 语句来解决我的问题。

      EventTimer t = new EventTimer();
          while(t.seconds < 2){
          if(eventDetected()) events++;
      }
      

      其实很简单!我意识到我的操作循环的每次迭代(因为上面的整个代码段都在一个无限循环中)将创建一个新的 EventTimer 线程,但是我最终会遇到内存问题。计时器达到 2 秒后如何关闭/结束线程?

      【讨论】:

      • 你仍然有可能错过一个事件——我强烈建议在 eventDetected() 中增加事件
      • 啊!谢谢!我明白你在说什么。我必须在我的代码中更改一堆来实现它。我意识到我的操作循环的每次迭代(因为上面的整个代码段都在一个无限循环中)将创建一个新的 EventTimer 线程,但是我最终会遇到内存问题。计时器达到 2 秒后如何关闭/结束线程?
      • 我相信你现在的 Runnable 将在大约 2 秒后结束,就像现在一样。一旦 run() 调用完成,它就完成了。
      • 我知道您是 StackOverflow 的新手——如果不接受有助于您实现目标的答案,至少要投票是一种常见的做法。
      猜你喜欢
      • 2021-05-12
      • 2020-01-18
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2018-03-24
      • 1970-01-01
      相关资源
      最近更新 更多