如何正确地睡在循环中

时间:2013-02-07 01:49:51

标签: java timer blocking

我有一个循环,他的工作是充当阻塞命令,每秒执行一次shell命令。 Java警告说“在循环中睡觉”。这是代码:

    while (!Shell.silentShellCommand(stringCommand).contains("Device detected")) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            log.errorHandler(ex);
        }
    }

当然有更好的方法可以做到这一点。我只是不知道如何。制作“阻塞计时器方法”的正确方法是什么?我正在使用它暂停执行,直到用户执行某些操作。

3 个答案:

答案 0 :(得分:2)

如果你想每秒执行一次,有更好的方法:

首先创建一个计时器:

Timer timer = new Timer();

然后安排固定时间执行:

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // Your repeatable execution here
  }
}, 1000, 1000);

就是这样。希望我能提供帮助。

答案 1 :(得分:1)

为什么不这样做:

public void loopMethod(){
    if(!Shell.silentShellCommand(stringCommand).contains("Device detected")){
        try {
            Thread.sleep(1000);
        } catch(InterruptedException ex) {
            ex.printStackTrace();
        }
        loopMethod();
    }
}

然后从后台线程调用该方法。那会有用吗?我的意思是,它在技术上仍然是一个循环,但由于某种原因它看起来更干净!

答案 2 :(得分:0)

经典变体是使用wait()
//等待线程

synchronized (mutex) {
     wait();
}

//其他线程会在服务员醒来时通知

synchronized (mutex) {
     notify();
}

如果您的任务是定期执行代码,那么您将使用TimerTask 例子见Giovanni的回答