![](/img/trans.png)
[英]Waiting for something to finsih, should I use thread.sleep or ReentrantLock?
[英]Is Thread.sleep(1000); something reliable to use?
我知道Thread.sleep(1000);
可用于冻结当前线程(在示例中为1秒),但由于您需要抛出Exception
我想知道它是否可以安全使用它。 我不想在程序中使用它并意外地导致问题。
使用Thread.sleep();
是否“正常” Thread.sleep();
或者有更好的方法来实现相同的结果吗?
顺便说一句,如果你想睡觉并且知道你不会使用中断,那么避免处理InterruptedExceptions的方便方法是使用Guava的Uninterruptibles,例如
Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);
如果以推荐的方式抛出一个(即重置中断状态)并避免难看的try-catch块,这将透明地处理InterruptedException。
因为你需要抛出异常,我想知道它是否安全使用它。
IllegalArgumentException
InterruptedException
,如果线程被中断 =>如果传递正数并且线程没有被中断,则不会有异常。
除非你从另一个线程调用theThread.interrupt()
,否则你会没事的。
编辑
看起来你想要创建一个计时器 - 在这种情况下,你可以通过使用内置机制让你的生活更简单:
Runnable r = new Runnable() {
public void run() { runYourTaskHere(); }
};
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS);
取决于你想要做什么,我已经看到Thread.sleep
被使用,它通常用于修复编程错误,因为人们认为它解决了竞争条件。 Thread.sleep
必须抛出一个异常,因为Java不控制CPU(最后我检查过),所以如果CPU有错误,或者即使它没有,并提前唤醒一个线程/以某种方式中断它的程序(Java)需要一种方法来终止自身并将消息传播到堆栈中。 此外,这在很大程度上取决于你的意思“相同的结果”
这是非常安全的。 JVM已经提供了InterruptedException,以便您可以在需要时处理它(假设您希望在此线程被中断时执行额外操作)...它实际上并不意味着发生了一些不好的事情。
由于thread.sleep
暂停当前线程一段时间(不杀死它)。 所以使用它是安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.