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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java自学书籍Top 10

    Java自学书籍Top 10

    这篇文章主要为大家推荐了Java书籍Top 10,是由Java Inside推荐的十本不错的Java书籍,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Java中Boolean与字符串或者数字1和0的转换实例

    Java中Boolean与字符串或者数字1和0的转换实例

    下面小编就为大家带来一篇Java中Boolean与字符串或者数字1和0的转换实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 关于Scanner对象的输入结束标记问题

    关于Scanner对象的输入结束标记问题

    这篇文章主要介绍了关于Scanner对象的输入结束标记问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • MyBatis图文并茂讲解注解开发一对多查询

    MyBatis图文并茂讲解注解开发一对多查询

    这篇文章主要介绍了SpringBoot中Mybatis注解一对多查询的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Java中如何获取图片文件格式(后缀)

    Java中如何获取图片文件格式(后缀)

    这篇文章主要介绍了Java中如何获取图片文件格式(后缀),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java自动解压文件实例代码

    Java自动解压文件实例代码

    Java自动解压文件实例代码,需要的朋友可以参考一下
    2013-04-04
  • Java接口和抽象类用法实例总结

    Java接口和抽象类用法实例总结

    这篇文章主要介绍了Java接口和抽象类用法,结合实例形式总结分析了Java接口与抽象类的具体定义、使用技巧与相关注意事项,需要的朋友可以参考下
    2015-12-12
  • 简述Springboot @Async 异步方法

    简述Springboot @Async 异步方法

    这篇文章主要介绍了Springboot @Async 异步方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • java生成二维码并且给二维码添加logo

    java生成二维码并且给二维码添加logo

    这篇文章主要介绍了java生成二维码并且给二维码添加logo的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • 细谈java同步之JMM(Java Memory Model)

    细谈java同步之JMM(Java Memory Model)

    Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。下面我们来一起学习下JMM
    2019-05-05

最新评论