如何在2秒内检查发生了多少事件? (定时器)

时间:2013-04-08 00:13:15

标签: java android multithreading loops timer

我需要检查在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()。我需要它在两秒计时器之间不断检查...所以我基本上需要同时发生这两件事。我有什么方法可以做到这一点吗?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

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

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

当你想开始听时:

listenForEvents = true;

在eventDetected()中:

if (listenForEvents) { events++; }

当您想要停止收听时(例如,在Thread.sleep()通话后):

listenForEvents = false;

使用多线程时,请务必注意并发问题检查和设置变量。

答案 1 :(得分:0)

我会告诉你我要跟踪什么样的事件然后我必须杀了你: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循环&amp; if语句来解决我的问题。

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

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