Java线程和线程中断

时间:2015-06-09 00:38:35

标签: java multithreading

从我可以整合的所有资源中,我仍然无法掌握线程中断。从Oracle自己的教程(https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html)中,他们没有解释导致中断异常的原因抛出,或如何,甚至是什么......他们只是说,只要你调用Thread.sleep()等某些方法就会发生这种情况。它被称为是随机发生的吗?是否有一段时间抛出异常?它被称为每次被抛出?这一切都没有意义,因为如果它是随机的,它对程序员来说是无用的,并且如果它在每次调用某个方法时发生,它就没有实际用途......它们会解释关于它的几乎没有,只是转向其他线程概念。我对学习C,Lua或Python没有任何问题,因为他们提供的教程和文档实际上解释了一切,这是第一次我曾经被教程完全困扰过。我一直在寻找约2个小时的答案。

你可以包括InterruptedException究竟是什么,以及它为什么被抛出?

3 个答案:

答案 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有时会做的随机事情。中断来自用户关闭应用程序之类的东西,或者可能是为了响应应用程序需要关闭的一些讨厌的错误情况。您无法提前知道在特定方法调用期间是否会发生这种情况,因此您必须对可能发生的情况进行编码。