Java线程中的interrupt详解

 更新时间:2023年09月26日 08:31:26   作者:EileenChang  
这篇文章主要介绍了Java线程中的interrupt详解,interrupt翻译成中文为“打断”的意思,但实际上,interrupt()方法并非将一个线程打中断的意思,本文提供了部分实现代码,需要的朋友可以参考下

interrupt概念

interrupt翻译成中文为“打断”的意思,但实际上,interrupt()方法并非将一个线程打中断的意思。查看Thread.interrupt()方法的源码:

public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

从以上源码可以知道,interrupt()方法只是设置了Thread对象中的一个标志位而已(Just to set the interrupt flag)。它的意义在于,线程可以通过这个标志位来决定需要做什么操作。

interrupt相关方法

  • interrupt()
    打断某个线程(设置标志位)
  • isInterrupted()
    查询某个线程是否被打断过(查询标志位)
  • interrupted()
    查询当前线程是否被打断过,并重置标志位
public class TestThread {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println("Thread is interrupted");
                System.out.println(Thread.currentThread().isInterrupted());
            }
        });
        thread.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
    }
}

输出如下:

Thread is interrupted
false

可知当线程sleep时,如果调用了interrupt()方法,将会抛出InterruptedException异常。捕获异常之后,会重置interrupt标志位。

wait、sleep、join与interrupt

当一个线程在wait、sleep或join时,如果调用了其interrupt()方法,则会抛出InterruptedException异常。

synchronized与interrupt

当一个线程在等待锁的时候,其能否被interrupt打断?

public class TestThread {
    public static void main(String[] args) {
        final Object o = new Object();
        new Thread(() -> {
            synchronized (o) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        Thread thread = new Thread(() -> {
            System.out.println("thread 获得锁");
        });
        thread.start();
        thread.interrupt();
    }
}

输出:

thread 获得锁

可知当线程等待锁时,并不会被打断。

ReentrantLock与interrupt

public class TestThread {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock.unlock();
        });
        Thread t2 = new Thread(() -> {
            lock.lock();
            System.out.println("t2 获得锁");
            lock.unlock();
        });
        t1.start();
        t2.start();
        t2.interrupt();
    }
}

输出:

t2 获得锁

此时,线程在lock等待时依然不会被打断。如果希望线程在lock等待时可以被打断,可使用lockInterruptibly方法。

到此这篇关于Java线程中的interrupt详解的文章就介绍到这了,更多相关线程之interrupt内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis-Plus实现2种分页方法(QueryWrapper查询分页和SQL查询分页)

    MyBatis-Plus实现2种分页方法(QueryWrapper查询分页和SQL查询分页)

    本文主要介绍了MyBatis-Plus实现2种分页方法,主要包括QueryWrapper查询分页和SQL查询分页,具有一定的参考价值,感兴趣的可以了解一下
    2021-08-08
  • java GUI编程之paint绘制操作示例

    java GUI编程之paint绘制操作示例

    这篇文章主要介绍了java GUI编程之paint绘制操作,结合实例形式详细分析了java GUI编程paint绘制相关操作技巧与使用注意事项,需要的朋友可以参考下
    2020-01-01
  • Java调用elasticsearch本地代码的操作方法

    Java调用elasticsearch本地代码的操作方法

    这篇文章主要介绍了Java调用elasticsearch本地代码的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 时间中间键的整理

    时间中间键的整理

    这篇文章主要介绍了时间中间键的整理的相关资料,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Java中toString函数的使用示例代码

    Java中toString函数的使用示例代码

    toString()函数用于将当前对象以字符串的形式返回,比如我定义了一个User类,创建了一个user对象,然后使用相应命令去打印user对象,本文结合示例代码介绍了toString函数的使用,需要的朋友可以参考下
    2024-02-02
  • springboot2.x解决运行顺序及Bean对象注入顺序的问题

    springboot2.x解决运行顺序及Bean对象注入顺序的问题

    这篇文章主要介绍了springboot2.x解决运行顺序及Bean对象注入顺序的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    这篇文章主要介绍了2020最新IDEA SpringBoot整合Dubbo(zookeeper版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 基于常用json框架介绍和Jackson返回结果处理方式

    基于常用json框架介绍和Jackson返回结果处理方式

    这篇文章主要介绍了基于常用json框架介绍和Jackson返回结果处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 深入java事件注册的应用分析

    深入java事件注册的应用分析

    本篇文章是对java事件注册进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于MyBatis结果映射的实例总结

    关于MyBatis结果映射的实例总结

    结果集映射主要是为了解决属性名和类型名不一致的问题,下面这篇文章主要给大家介绍了关于MyBatis结果映射的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05

最新评论