【问题标题】:Terminate infinite loop after 20 seconds in android在android中20秒后终止无限循环
【发布时间】:2012-08-17 13:38:16
【问题描述】:

我有一个无限 for 循环,我想运行这个 for 循环 20 秒,然后我想终止循环,我该怎么办?

这是我在 android 中的代码:

do {
    rl += Character.toString((char) in.read());
    // Log.i("RL", "" + rl);
    if (rl.contains("<") && checkStream(rl)) {
        // Log.i("RL INSIDE", "" + rl);
        getNumerAndStatusFromRLString(rl);
        rl = "";
    }
    if (20 SECONDS COMPLETED) {
        Log.i("<rl>", "exit");
        break;
    }
} while (true);

那么我可以做些什么来检查 20 秒是否已完成,现在该终止了。

任何想法都会受到赞赏。

【问题讨论】:

    标签: java android time timer


    【解决方案1】:

    我认为其中一个选项可能是在循环之前获取时间,并且在循环时检查是否经过 20 秒。

    如下所示:不确定效率。

       long startTime=   System.currentTimeMillis();
    do {
    
    ......
    
         long currTime=  System.currentTimeMillis();
         long elapsedtime = currTime - startTime;
         if(elapsedtime > 20000)
          {
          break;
          }
    }
    

    【讨论】:

    • 是的,我有同样的想法,但我怎么能得到 20 秒的差异?
    • 经过时间应与 20*1000 进行比较。以毫秒为单位。
    • @RushabhPatel:你不能准确地捕捉到 20 秒,这就是 > 符号的原因。由于处理时间的原因,我们不知道下一次迭代执行的时间。
    • @thinksteep:1 毫秒的睡眠时间将使循环暂停 1/1000 秒。您将无法注意到它,但对于 CPU 来说,一毫秒也可能是一年。这样的更改可以将 100% 的 cpu 使用率降低到几乎 0% 的 cpu 使用率。
    • (...继续. (在这种情况下,您应该使用中断来代替,并且可能首先不使用java)另一方面,如果您可以使用〜1000hz的循环频率,那么您想在循环中添加1 ms的睡眠。这允许线程停止片刻并允许 cpu 执行其他操作。 (续)
    【解决方案2】:

    使用Timer Task 可以指定任务运行的时间长度。

    一个告诫者:使用的这组函数需要一个重复频率,但作为一个一次性定时的东西,你可以通过使用一个可以发出取消信号的处理程序来绕过它!

    一个例子是这样的:

    private Timer myTimer = new Timer();
    private final int CANCEL_EXECUTION = 0x100;
    private Handler myHandler = new Handler();
    
    public void runFor20Sec(){
       myTimer.schedule(new TimerTask(){
           @Override
           public void run(){
              // Do something here
              myHandler.obtainMessage(CANCEL_EXECUTION).sendToTarget();
           }
        }, System.currentTimeMillis(), 2000);
    }
    public class myHandler extends Handler{
        @Override
        public void handleMessage(Message msg){
            switch(msg.what){
               case CANCEL_EXECUTION :
                   myTimer.cancel();
                   break;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 2020-01-20
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多