大家好,我是小米,今天来和大家聊聊一个经常出现在Java面试中的问题:interrupted和isInterrupted方法的区别。说到面试题,尤其是社招的面试题,通常问题都不简单,尤其是这类考察Java多线程的小问题,考官不仅想考察你对API的了解,还想了解你对Java并发机制的掌握程度。
很多同学在面试时会遇到这样的问题:“请解释一下interrupted和isInterrupted方法的区别”。如果你像我之前一样也被这个问题卡住过,那么今天这篇文章就专门为你准备,帮助你理解这两个方法的差异。
前言:多线程的“打断”
我们都知道,在Java中,多线程编程是一个非常重要的部分。为了能够控制线程的运行状态,Java提供了一些方法来操作线程的中断(interrupt),而interrupted和isInterrupted就是与线程中断相关的两个方法。
中断的核心思想就是通过让线程感知某些信号来让其提前终止,这在需要长时间运行的任务中非常有用,比如下载文件、网络请求等操作,我们希望能够通过中断来及时终止线程,防止浪费不必要的资源。
而interrupted和isInterrupted就是用来帮助我们判断线程是否已被中断的两个工具。不过,它们虽然都与中断相关,但在实现和语义上有一些关键的区别。
isInterrupted 方法
1. 什么是isInterrupted?
isInterrupted是Thread类中的一个实例方法。它的作用是判断当前线程是否已经被中断。这个方法是线程实例方法,也就是说,你需要通过线程对象来调用它。
2. 如何理解isInterrupted?
isInterrupted方法返回一个布尔值,表示当前线程是否已被中断。如果线程已经调用了interrupt()方法,或者线程在执行某些操作时抛出了InterruptedException,则它的状态会变为“中断”。当你调用isInterrupted时,它会直接返回这个状态。
不过,isInterrupted方法并不会清除线程的中断标志。也就是说,调用isInterrupted并不会改变线程的中断状态,它只是查询当前线程的中断状态。
3. 代码示例
解释:
- isInterrupted查询的是线程对象本身的中断状态。
- 即使子线程被中断,主线程的中断状态是不会受到影响的。
interrupted 方法
1. 什么是interrupted?
interrupted是Thread类中的一个静态方法。它的作用是判断当前执行的线程(即调用interrupted的线程)是否已经被中断。与isInterrupted方法不同,interrupted是静态方法,所以它总是检查调用它的当前线程的中断状态。
2. 如何理解interrupted?
interrupted方法与isInterrupted的最大区别就是它会在返回结果之前清除线程的中断状态。也就是说,调用interrupted会返回当前线程的中断状态,并且在返回后会将该线程的中断标志清除。
这就意味着,调用interrupted后,再次调用interrupted方法将返回false,除非再次调用interrupt显式地设置中断标志。
3. 代码示例
解释:
- interrupted返回的是当前线程的中断状态,并在返回后清除该中断标志。
- 上述代码中,主线程调用了Thread.interrupted()两次,两次返回的都是false,因为调用后,中断状态会被清除。
isInterrupted 和 interrupted的关键区别
- 调用对象不同
- isInterrupted是实例方法,需要通过一个具体的线程对象来调用,检查该线程的中断状态。
- interrupted是静态方法,用于检查调用它的当前线程的中断状态。
- 中断状态的影响
- isInterrupted方法不会清除线程的中断标志,只是返回该线程当前的中断状态。
- interrupted方法会返回当前线程的中断状态,并且在返回后清除该线程的中断标志。
- 适用场景不同
- isInterrupted适用于检查一个特定线程的中断状态,尤其是在多线程环境中需要检查其他线程是否中断时。
- interrupted适用于在当前线程内部检查自己是否被中断,并且清除中断标志,常见于在处理异常后主动清理中断标志的场景。
总结
- isInterrupted和interrupted这两个方法的功能看似相似,但其实有着非常重要的区别。
- isInterrupted不会改变线程的中断状态,而interrupted会在返回中断状态后清除当前线程的中断标志。
- isInterrupted是实例方法,检查的是特定线程的中断状态;interrupted是静态方法,检查的是调用它的当前线程的中断状态。
在多线程编程中,合理使用这两个方法非常重要,尤其是在处理任务中断的场景下。理解它们的差异,能让你在面试中脱颖而出,也能帮助你在实际项目中更高效地进行多线程管理。
END
希望这篇文章能够帮助大家清晰地理解这两个方法的区别,让你在面对面试官时更加自信。如果你在学习Java的过程中遇到任何问题,欢迎在评论区留言,我们一起讨论!
我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!