在程序中添加延迟

时间:2012-10-30 03:28:30

标签: java

我想使用Thread.sleep(1000)命令在我的程序中添加延迟(所以在继续之前让它停止1秒),但这意味着我还需要添加throws InterruptedException。但是,我不知道该把它放在哪里。

我的代码现在基本上就是这样:

public static void main(String[] args) {
    Clock myClock = new Clock;   // new clock object.

    while (true) {
        myClock.tick();
    }
}

我的另一堂课:

public class Clock {
    // .. some constructors and stuff

    public void tick() {
        secondHand.draw();   // redraws the second hand to update every second
    }

    // .. some more methods and stuff
}

我希望每1秒只调用tick()方法,但我不知道在哪里可以放置Thread.sleepthrows InterruptedException语句。任何帮助,将不胜感激。另外,我可以通过其他方式输入我的时钟滴答和/或更新也会有所帮助!

5 个答案:

答案 0 :(得分:5)

  

我想每1秒调用一次tick()方法

在调用tick()之后,按如下方式对当前线程进行休眠:

public static void main(String[] args) {
    Clock myClock = new Clock;   // new clock object.

    while (true) {
        myClock.tick();
        // wait for a second.
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ie) {
            // Handle the exception
        }
    }
}

答案 1 :(得分:1)

根据程序的流程,您需要将Thread.sleep(1000);语句放入控制逻辑中。我的意思是,无论什么逻辑调用,tick()方法按照惯例都是引入逻辑控制的最佳位置 - 在本例中是Thread.sleep(1000);语句。

唉,你的调用逻辑应该是这样的:

try {
    while (true) {
        Thread.sleep(1000);
        myClock.tick();
    }
} catch(InterruptedException e) {
    System.err.println("Something went wrong");
}

这种方法可确保如果您有其他控制逻辑访问您的tick()方法,那么它将不会与1秒延迟相关联。不同的客户通常有不同的需求......

我更喜欢将整个while循环包装在try catch块中以获得可伸缩性安全可读性......我的意思是,如果你tick()方法中的逻辑变得更复杂,你最终会抛出更多异常你可以简单地将catch子句添加到一个try catch块中,如下所示:

try {
    while (true) {
        Thread.sleep(1000);
        myClock.tick();
    }
} catch(InterruptedException e) {
    System.err.println("Something went wrong");
} catch(SomeNewExcetion e) {
    System.err.println("Something went wrong");
} catch(SomeOtherNewExceptoion e) {
    System.err.println("Something went wrong");
} catch(SomeFinalException e) {
    System.err.println("Something went wrong");
}

答案 2 :(得分:1)

您可以使用javax.swing.Timerjava.util.Timer来获得相同的结果。

javax.swing.Timer的优点是,当它被触发时,ActionPerformed方法在事件调度线程中执行,从而更容易更新UI。

<强> java.util.Timer中

timer = new Timer();
timer.schedule(new TickTock (), 1000);

public class TickTock extends TimerTask {
    public void run() {
        System.out.println("Tick tock!");
    }
}

<强> javax.swing.Timer中

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Tick tock!");
        repaint();
    }
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();

您可以阅读How to Use Swing Timers了解有关javax.swing.Timer

的更多信息

答案 3 :(得分:1)

虽然我通常不建议。

在这种情况下,您不需要为此被中断编码。 通过包装运行时异常来隐藏它。

public class Clock {
    // .. some constructors and stuff

    public void tick() {
       secondHand.draw();   // redraws the second hand to update every second
    }
    public void wait() {
       try {
           Thread.sleep(1000)
       } catch(InterruptedException e) {
           throw new RuntimeException("Don't know how to handle this", e);
       }
    }
   // .. some more methods and stuff
}

答案 4 :(得分:0)

在java中非常简单

TimeUnit.SECONDS.sleep(2);