2

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

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

4

2 回答 2

1

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

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

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

当您想开始收听时:

listenForEvents = true;

在 eventDetected() 中:

if (listenForEvents) { events++; }

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

listenForEvents = false;

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

于 2013-04-08T00:25:21.590 回答
0

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

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

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

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 秒后,我将如何关闭/结束线程?

于 2013-04-08T00:34:50.657 回答