前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每天一个Java面试题之interrupted和isInterrupted方法的区别

每天一个Java面试题之interrupted和isInterrupted方法的区别

作者头像
灬沙师弟
发布于 2024-09-10 13:11:12
发布于 2024-09-10 13:11:12
19002
代码可运行
举报
文章被收录于专栏:Java面试教程Java面试教程
运行总次数:2
代码可运行

前言

Java编程中,多线程是一个重要的概念,它允许程序同时执行多个任务。在处理多线程时,线程中断是一个关键的机制,它允许一个线程通知另一个线程应该停止当前的操作。Java提供了interruptedisInterrupted两个方法来处理线程中断,但它们之间有一些细微的差别。在这篇博客中,将深入探讨这两个方法的区别,并提供代码示例来帮助理解。

线程中断机制简介

在Java中,线程中断是一种协作机制,它允许一个线程请求另一个线程停止当前的操作。当一个线程被中断时,它的中断状态会被设置为true。线程可以通过检查自己的中断状态来决定是否要停止当前的操作。

interrupted 方法

interrupted 方法是一个静态方法,它属于Thread类。当调用此方法时,它会清除当前线程的中断状态,并且返回线程被中断之前的中断状态。换句话说,如果当前线程被中断过,interrupted 方法会返回true,并且清除中断状态;如果当前线程没有被中断,它会返回false,并且不做任何改变。

isInterrupted 方法

interrupted方法不同,isInterrupted 方法是一个实例方法,它同样属于Thread类。此方法用于检查调用它的线程的中断状态。如果线程被中断,它会返回true;如果没有被中断,它会返回false。需要注意的是,isInterrupted 方法不会改变线程的中断状态。

代码示例

为了更好地理解这两个方法的区别,让我们通过一些代码示例来展示它们的使用。

示例1:使用 interrupted 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class InterruptedExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("Thread is running...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("Thread was interrupted during sleep.");
                    return;
                }
            }
            System.out.println("Thread interrupted status cleared.");
        });

        thread.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread interrupts the running thread.");
        thread.interrupt();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread checks if the running thread was interrupted.");
        boolean interrupted = thread.isInterrupted();
        System.out.println("Thread was interrupted: " + interrupted);
    }
}

在这个示例中,我们创建了一个线程,它在循环中每隔一秒打印一次消息。主线程在3秒后中断了这个线程。然后,我们检查了线程的中断状态,并发现它已经被设置为true

示例2:使用 isInterrupted 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class IsInterruptedExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println("Thread was interrupted during sleep.");
            }
            System.out.println("Thread finished execution.");
        });

        thread.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread interrupts the running thread.");
        thread.interrupt();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread checks if the running thread was interrupted.");
        boolean interrupted = Thread.interrupted();
        System.out.println("Thread was interrupted: " + interrupted);
    }
}

在这个示例中,我们同样创建了一个线程,但它在睡眠5秒后结束。主线程在3秒后中断了这个线程。然后,我们使用Thread.interrupted()方法检查了当前线程的中断状态,并且发现它已经被设置为true

总结

interruptedisInterrupted 方法都是用于处理线程中断状态的工具,但它们的使用场景和行为有所不同。interrupted 方法用于清除当前线程的中断状态,而isInterrupted 方法用于检查线程的中断状态但不清除它。理解这两个方法的区别对于正确地处理线程中断非常重要。

在实际编程中,我们应该根据具体的需求选择合适的方法来处理线程中断。例如,如果你需要在捕获InterruptedException后清除中断状态,那么interrupted 方法是一个好的选择。如果你只是想检查线程是否被中断,而不需要清除状态,那么isInterrupted 方法可能更适合。

希望这篇博客能帮助你更好地理解Java中的线程中断机制,以及如何正确地使用interruptedisInterrupted方法。如果你有任何疑问或需要进一步的帮助,请随时留言。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于interrupt(),interrupted(),isInterrupted()用法分析
interrupt()是用于中断线程的,调用该方法的线程的状态将被置为"中断"状态。注意:线程中断仅仅是设置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。这里可以看到中断后该线程还在继续往下执行,并没有强制终止线程。
砖业洋__
2023/05/06
3510
关于interrupt(),interrupted(),isInterrupted()用法分析
Java中如何安全中断线程及其使用场景
在多线程编程中,线程中断是一种常见的控制线程执行流的机制,能够在一定程度上避免程序中线程因超时、死锁等原因而阻塞、浪费系统资源或造成程序卡死的问题。然而,直接停止线程的操作(如 Thread.stop() 或 Thread.suspend())是非常危险的,因为它们会带来不可预测的严重后果,比如线程持有的锁永远不会释放,导致其他线程永远无法获得锁而进入死锁状态。因此,Java 提供了一个较为优雅且安全的方式来中断线程,这就是通过使用中断信号来实现线程的安全终止。
九转成圣
2025/01/17
1910
InterruptedException: A thread was interrupted while waiting 完美解决方法
大家好,我是默语,一名专注于全栈开发、运维和人工智能技术的博主。今天我们将深入讨论多线程编程中常见的 InterruptedException。这是当线程在等待、休眠或执行其他阻塞操作时被中断所抛出的异常。本文将解释该异常的根本原因,并提供一些实用的代码示例来应对和解决这种异常。
默 语
2024/11/22
2480
一文搞懂 Java 线程中断
在之前的一文《如何"优雅"地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享的——线程中断。
Java技术栈
2019/07/12
7090
一文搞懂 Java 线程中断
如何优雅地处理Java多线程中的中断和异常
在Java多线程编程中,正确处理线程中断和异常对于确保程序的稳定性和健壮性至关重要。本文将介绍一些关键的最佳实践,并提供示例代码来说明这些观点。
灬沙师弟
2024/09/24
3680
如何优雅地处理Java多线程中的中断和异常
《JavaSE-第二十一章》之线程的状态与中断
线程状态好比一个人的生命周期,从出生到死亡,期间会经历从婴儿到少年,从少年到青年,最终走向死亡。在java.lang.Thread.State枚举类中定义了以下六种线程的状态来描述线程的生命周期。
用户10517932
2023/10/07
2130
《JavaSE-第二十一章》之线程的状态与中断
interrupt interrupted isInterrupted 方法对比、区别与联系 多线程中篇(八)
interrupt interrupted isInterrupted 是三个“长相”非常类似的方法。
noteless
2019/03/04
5350
interrupt interrupted isInterrupted 方法对比、区别与联系 多线程中篇(八)
线程中断以及线程中断引发的那些问题,你值得了解
上周写了一篇多线程的文章,其实更多方面是偏基础一点的文章,而且也比较大白话,争取人人都能看的明白,再举一些常见的例子,能很好的帮助大家理解多线程,文章发表之后我投给了几个大号和CSDN反应都挺好的,大家表示希望能写更多这样的文章,希望再多写写线程相关的文章,所以我打算从线程的基础开始写起,每周写那么两三篇,大家闲的时候可以看看,也可以多吸收一点东西。
一个程序员的成长
2020/11/25
5040
线程中断以及线程中断引发的那些问题,你值得了解
Java并发编程——Thread类中interrupt()、interrupted()和isInterrupted()方法详解
其作用是表示可以中断此线程 实际上只是给线程设置一个中断标志,线程仍会继续运行。
向着百万年薪努力的小赵
2022/12/02
7250
Java并发编程——Thread类中interrupt()、interrupted()和isInterrupted()方法详解
Java多线程三:线程中断
有线程运行,肯定就会有线程中断,在Java语言中,线程中断是一种协作机制,通过对线程设置中断标记,告知对应的线程,根据中断标记来决定是否需要中断当前线程。也就是说,在线程运行过程中,其实我们没有办法安全,准确的终止一个线程。
全栈学习笔记
2022/06/14
5180
Java多线程三:线程中断
4. LockSupport与线程中断
cheese
2024/03/04
1590
4. LockSupport与线程中断
一文搞懂 Java 线程中断
下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了。
Java_老男孩
2019/12/02
2K0
【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)
-- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程;
韩曙亮
2023/03/27
3.3K0
Java并发之线程中断
     前面的几篇文章主要介绍了线程的一些最基本的概念,包括线程的间的冲突及其解决办法,以及线程间的协作机制。本篇主要来学习下Java中对线程中断机制的实现。在我们的程序中经常会有一些不达到目的不会
Single
2018/01/04
1.2K0
Java并发之线程中断
JUC从实战到源码:中断机制与API实现
在Java中,线程中断是一种机制,用于通知线程应该停止当前正在执行的任务。中断通常用于协同线程之间的合作,以便让线程在适当的时候终止其工作,尤其是在长时间运行的任务或阻塞操作中。通过学了多线程以及synchronized的相关知识,接下来就到了学习线程中断知识。
怒放吧德德
2024/09/24
1781
如何停止/中断一个运行中的线程
https://github.com/FutaoSmile/learn-thread/tree/master/src/main/java/com/futao/learn/threads/c_%E5%A6%82%E4%BD%95%E5%81%9C%E6%AD%A2%E7%BA%BF%E7%A8%8B
用户1516716
2020/06/17
3.4K0
如何停止/中断一个运行中的线程
java 线程interupt stop(dep)[通俗易懂]
https://blog.csdn.net/zbw18297786698/article/details/53432879/
全栈程序员站长
2022/11/01
6170
并发编程之线程中断interrupt
线程中断可能在平时的开发中我们用的不多,但是我相信大部分都见过InterruptedException,因为不管我们在调用object.wait()还是Thread.sleep()都会抛出一个InterruptedException。可能有很多人都是直接的继续抛出去或者不做任何处理直接打印堆栈信息,当然有可能这样没有问题,但是有些业务我们这样处理并不适合。要弄懂这些,我们就需要知道interrupt的作用是什么。
全栈程序员站长
2021/08/05
5260
【Java】已解决:`java.lang.ThreadDeath: 线程终止`
java.lang.ThreadDeath是一个特殊的错误类型,继承自java.lang.Error,并且是唯一一个被Thread.stop()方法抛出的异常。尽管ThreadDeath本质上是一个错误而非异常,但它可以被捕获。然而,由于其与线程强制终止密切相关,通常建议不要捕获它,而是允许线程自然终止。
屿小夏
2024/08/27
1700
JUC - 线程中断与线程等待、唤醒(LockSupport)
​ 首先 ​ 一个线程不应该由其他线程来强制中断或停止,而是应该有线程自己自行停止,自己来决定自己的命运。 ​ 所以,Thread.stop, Thead.suspend, Thead.resumer都已经被废弃了。
鱼找水需要时间
2023/02/16
1K0
JUC - 线程中断与线程等待、唤醒(LockSupport)
推荐阅读
相关推荐
关于interrupt(),interrupted(),isInterrupted()用法分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验