我想使用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.sleep
和throws InterruptedException
语句。任何帮助,将不胜感激。另外,我可以通过其他方式输入我的时钟滴答和/或更新也会有所帮助!
答案 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.Timer
或java.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);