从我可以整合的所有资源中,我仍然无法掌握线程中断。从Oracle自己的教程(https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html)中,他们没有解释导致中断异常的原因抛出,或如何,甚至是什么......他们只是说,只要你调用Thread.sleep()等某些方法就会发生这种情况。它被称为是随机发生的吗?是否有一段时间抛出异常?它被称为每次被抛出?这一切都没有意义,因为如果它是随机的,它对程序员来说是无用的,并且如果它在每次调用某个方法时发生,它就没有实际用途......它们会解释关于它的几乎没有,只是转向其他线程概念。我对学习C,Lua或Python没有任何问题,因为他们提供的教程和文档实际上解释了一切,这是第一次我曾经被教程完全困扰过。我一直在寻找约2个小时的答案。
你可以包括InterruptedException究竟是什么,以及它为什么被抛出?
答案 0 :(得分:6)
从您链接到tutorial的第一段开始:
线程通过在
interrupt
对象上调用Thread
来发送中断 线程被中断。
这意味着Thread threadX
的中断是由任何其他调用threadX.interrupt()
的线程引起的。
它不是随机发生的 - 任何中断另一个线程的函数都会明确地这样说。 (主要是线程池等上的关闭类型函数。)
Thread.sleep()
之类的通话会关注interrupt()
的通话,并通过抛出异常作出回应。
但是如果您的主题没有通过抛出InteruptedException
来调用监视中断的函数 - 那么您可以使用Thread.isInterrupted()
(这是本教程的内容)来监视它。
以下是您可以如何使用它的示例。 threadX
已启动并开始打印。主线程(启动threadX
等待一会儿然后中断threadX
,这会导致Thread.sleep()
中的threadX
抛出InterruptedException
- {{1}然后将有机会打印出退出消息。
threadX
值得注意的是,如果你的函数处理 Thread threadX = new Thread( new Runnable() {
public void run() {
try {
while(true) {
Thread.sleep(100);
System.err.println("In threadX");
}
} catch (InterruptedException e) {
System.err.println("ThreadX interrupted and exiting...");
// Restore the interrupted status
// not really needed here as we know the thread is exiting
// but a good practice all the same. (So callers know
// we've been interrupted.)
Thread.currentThread().interrupt();
}
}
});
threadX.start();
Thread.sleep(1000);
threadX.interrupt();
并且没有重新抛出它,(并且不会导致线程立即退出)那么你应该恢复intterupted状态(它将被清除InterruptedException的thrower)这样任何调用者都知道线程已被中断。 (相反,如果你抛出InterruptedException
,因为你发现InterruptedException
是真的,你应该首先清除被中断的状态)
答案 1 :(得分:2)
当调用Thread的interrupt()
方法时,会发生线程中断。
对Thread.sleep()
的引用与处理中断有关,而不是提升它。一些方法,例如Thread.sleep()
抛出InterruptedException
,它使程序员有机会以任何你喜欢的方式处理中断。
如果线程从不或很少调用抛出InterruptedException
的方法,则可以通过调用Thread.interrupted()
来检查线程的中断状态,如果为true,则执行相应的操作。
答案 2 :(得分:0)
中断来自另一个线程。像许多其他并发行为一样,它是"随机"因为它可能在任何特定的方法调用期间发生,也可能不会发生,但它不仅仅是java有时会做的随机事情。中断来自用户关闭应用程序之类的东西,或者可能是为了响应应用程序需要关闭的一些讨厌的错误情况。您无法提前知道在特定方法调用期间是否会发生这种情况,因此您必须对可能发生的情况进行编码。