Java线程中的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编译错误java.lang.NoSuchFieldError的解决方案详析
java.lang.NoSuchFieldError是 Java 中的一种运行时错误,这篇文章主要介绍了Java编译错误java.lang.NoSuchFieldError的解决方案,文中通过代码介绍的非常详细,需要的朋友可以参考下2025-11-11
Java异常处理之try...catch...finally详解
今天小编就为大家分享一篇关于Java异常处理之try...catch...finally详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01
在Spring Boot中集成RabbitMQ详细步骤(最新推荐)
本文将介绍如何在Spring Boot项目中集成RabbitMQ,实现生产者和消费者的基本配置,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2023-12-12
Java后端对接微信支付(小程序、APP、PC端扫码)包含查单退款
微信支付我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,本文主要介绍了Java后端对接微信支付(小程序、APP、PC端扫码)包含查单退款,具有一定的参考价值,感兴趣的可以了解一下2021-12-12
Maven中怎么手动添加jar包到本地仓库详解(repository)
这篇文章主要给大家介绍了关于Maven中怎么手动添加jar包到本地仓库的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2023-04-04
Java BufferedOutputStream类的常用方法讲解
这篇文章主要介绍了Java BufferedOutputStream类的常用方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10


最新评论