我知道Thread.sleep(1000);
可以用来冻结当前线程(在示例中为1秒),但是因为你需要抛出Exception
我想知道它是否安全使用它。我不想在程序中使用它并意外地导致问题。
使用Thread.sleep();
是否“没问题”还是有更好的方法来实现相同的结果?
答案 0 :(得分:9)
顺便说一句,如果你想睡觉并且知道你不会使用中断,那么避免处理InterruptedExceptions的一种方便方法是使用Guava的Uninterruptibles,例如
Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);
如果以推荐的方式抛出一个(即重置中断状态)并避免难看的try-catch块,这将透明地处理InterruptedException。
答案 1 :(得分:5)
因为你需要抛出异常,我想知道它是否安全使用它。
Thread#sleep only throws 2 exceptions:
IllegalArgumentException
如果参数为负InterruptedException
如果线程被中断=>如果你传递一个正数并且线程没有被中断,那么就没有例外。
除非你从另一个主题调用theThread.interrupt()
,否则你会没事的。
修改强>
似乎你想创建一个计时器 - 在这种情况下,你可以通过the built-in mechanisms使你的生活变得更简单:
Runnable r = new Runnable() {
public void run() { runYourTaskHere(); }
};
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS);
答案 2 :(得分:0)
取决于你想要做什么,我看到Thread.sleep
被使用,它通常用于修复编程错误,因为人们认为它可以解决竞争条件。 Thread.sleep
必须抛出一个异常,因为Java不控制CPU(我最后检查过),所以如果CPU有错误,或者即使它没有,并且早期唤醒线程/以某种方式中断它程序(Java)需要一种终止自身并在栈中传播消息的方法。此外,这在很大程度上取决于“相同结果”的含义
答案 3 :(得分:0)
非常安全。 JVM已经提供了InterruptedException,以便你可以在需要时处理它(假设你想在这个线程被中断时做一些额外的事情)......它实际上并不意味着发生了一些不好的事情。
答案 4 :(得分:0)
从thread.sleep
暂停当前线程达指定时间(不杀死它)。所以使用它是安全的。