Java 的 Thread.sleep 何时抛出 InterruptedException?无视它安全吗?我没有做任何多线程处理。我只是想等几秒钟再重新尝试一些操作。
一般来说,你不应该忽视这个例外,看看下面的文章:
不要忍气吞声 有时抛出 InterruptedException 是 而不是选项,例如当由 Runnable 定义的任务调用 在这种情况下,您不能重新抛出 异常,但是您也不希望什么都不做 阻塞方法检测到中断并抛出 InterruptedException, 它会清除中断状态 但不能重新抛出,你应该保存的证据 发生了中断,因此调用堆栈上更高的代码可以 学习中断,如果它愿意的话就回应它。这个任务 是通过调用中断()来“重新中断”当前 线程,如清单3所示 异常并且不重新抛出它,重新中断当前 在返回之前穿线。 public class TaskRunner implements Runnable { private BlockingQueue<Task> queue; public TaskRunner(BlockingQueue<Task> queue) { this.queue = queue; } public void run() { try { while (true) { Task task = queue.take(10, TimeUnit.SECONDS); task.execute(); } } catch (InterruptedException e) { // Restore the interrupted status Thread.currentThread().interrupt(); } } } 来自 不要忍气吞声
不要忍气吞声
有时抛出 InterruptedException 是 而不是选项,例如当由 Runnable 定义的任务调用 在这种情况下,您不能重新抛出 异常,但是您也不希望什么都不做 阻塞方法检测到中断并抛出 InterruptedException, 它会清除中断状态 但不能重新抛出,你应该保存的证据 发生了中断,因此调用堆栈上更高的代码可以 学习中断,如果它愿意的话就回应它。这个任务 是通过调用中断()来“重新中断”当前 线程,如清单3所示 异常并且不重新抛出它,重新中断当前 在返回之前穿线。
public class TaskRunner implements Runnable { private BlockingQueue<Task> queue; public TaskRunner(BlockingQueue<Task> queue) { this.queue = queue; } public void run() { try { while (true) { Task task = queue.take(10, TimeUnit.SECONDS); task.execute(); } } catch (InterruptedException e) { // Restore the interrupted status Thread.currentThread().interrupt(); } } }
点击这里查看整篇文章:
Http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-
在单线程代码中处理它的一种可靠而简单的方法是捕获它并在 RuntimeException 中反向处理它,以避免为每个方法声明它。
Java 专家通讯(我可以毫无保留地推荐)有一个 有趣的文章,以及如何处理 InterruptedException。这本书很值得一读和消化。
InterruptedException
当睡眠被中断时,通常会引发 InterruptedException。
如果抛出 InterruptedException,则意味着有东西想要中断(通常是终止)该线程。这是由对线程 interrupt()方法的调用触发的。Wait 方法检测到这一点,并抛出一个 InterruptedException,这样 catch 代码就可以立即处理终止请求,而不必等到指定的时间结束。
interrupt()
如果您在单线程应用程序(以及一些多线程应用程序)中使用它,则永远不会触发该异常。通过使用空 catch 子句忽略它,我不建议这样做。抛出 InterruptedException清除线程的中断状态,因此如果处理不当,信息就会丢失。因此,我建议参选:
} catch (InterruptedException e) { Thread.currentThread().interrupt(); // code for stopping current task so thread stops }
再次设置该状态。然后,完成执行。这将是正确的行为,甚至强硬从未使用。
或许更好的做法是加上以下内容:
} catch (InterruptedException e) { throw new RuntimeException("Unexpected interrupt", e); }
语句到 catch 块。这基本上意味着它永远不会发生。因此,如果代码在可能发生这种情况的环境中被重用,它就会抱怨。
像 Thread类的 sleep()和 wait()这样的方法可能抛出一个 InterruptedException。如果其他 thread想要中断正在等待或睡眠的 thread,就会发生这种情况。
Thread
sleep()
wait()
thread
根据个人经验,我只是把 thread.sleep()改成了 this.sleep()
thread.sleep()
this.sleep()
来自 医生:
当线程在等待时抛出 InterruptedException, 睡眠,或以其他方式占用线程,并且线程被中断 在活动之前或期间。
换句话说,当某些代码在特定线程上调用了 interrupt()方法时,就会发生 InterruptedException。它是一个已检查的异常,Java 中的许多阻塞操作都可能抛出它。
中断系统的目的是提供另一种工作流,允许线程中断其他线程中的任务。中断不一定会中断正在运行的线程,但它也可以请求线程在下一个方便的时机中断自己。
线程可能会因为以下几个原因而被阻塞:
Thread.sleep()
所有阻塞方法通常都会抛出 InterruptedException,以便能够处理它并执行纠正操作。
然而,在大多数情况下,由于我们的代码是 Runnable 的一部分,在这种情况下,我们必须捕获它并恢复状态。
Java 中有很多抛出 异常的方法,例如:
对象类:
Thread.join()
BlockingQueue:
put()
take()