线程 interrupted 详细解析
目录
2.先看下例子
3. 研究下 下面3个方法的jvm层面实现 跟用法
3.1)thread.isInterrupted()
3.2)thread.interrupt();
3.3)Thread.interrupted()
4.最后代码验证下
1.为什么这个方法值得我写个文章。?
因为这个方法跟我们的字面意思不太一样。。。。我们想当然的以为 这个就是打断线程。。实际上不是
2.先看下例子
package com.imooc.controller.jdk;
import io.netty.channel.Channel;
import lombok.SneakyThrows;
import sun.misc.Unsafe;
import java.util.concurrent.TimeUnit;
/**
* @description:
* @author: yk
* @time: 2022/5/27 9:12
*/
public class a {
@SneakyThrows
public static void main(String[] args) {
Thread thread = Thread.currentThread();
Thread sub = new Thread(() -> {
System.out.println("main...........111...."+thread.isInterrupted());
thread.interrupt();
// System.out.println("main...........2222...."+thread.isInterrupted());
// System.out.println("main...........2222...."+thread.isInterrupted());
});
sub.start();
for(;;){
System.out.println("main going..........");
}
// Unsafe unsafe =SafeUtil.getUnsafe();
// unsafe.park(false,0);
// System.out.println("main..............");
// System.out.println("main...........33333...."+Thread.interrupted());
// System.out.println("main...........33333...."+Thread.interrupted());
}
}
结果:main线程并没有被打断,而是疯狂的打印信息。。。。跟我们想的完全不一样
3. 研究下 下面3个方法的jvm层面实现 跟用法
3.1)thread.isInterrupted()
Thread.c 中找到对应的方法,---》
jvm.cpp中找到对应的方法
thread.cpp 中查看
最后到 os_linux.cpp中查看
可以看出 就是去获取标记位的,如果被打断就返回true 否则返回false
3.2)thread.interrupt();
public void interrupt() {
if (this != currentThread()) {
this.checkAccess();
}
synchronized(this.blockerLock) {
Interruptible var2 = this.blocker;
if (var2 != null) {
this.interrupt0();
var2.interrupt(this);
return;
}
}
this.interrupt0();
}
打断的方法,我们来具体看看实现
同上类似的找法,我们到os_linux.cpp中看到对应的方法
可以看出,1.设置标记位 true,表示被打断的 2.唤醒park的线程,比如sleep, synchronized,unsafe 等操作导致的线程挂起操作。(可以看出 interrupt 实际上是唤醒的意思。。是不是跟我们想当然的不一样)
3.3)Thread.interrupted()
这个方法是获取当前的线程 是否被打断的状态。(注意此处 传值 true,而 thread.isInterrupted() 传值是false)
thread.isInterrupted()
那这个boolean 什么意思呢?我们到jvm中看看
也就是说
thread.isInterrupted() 这个传值false,不会清除标记位的值
Thread.interrupted() 这个传值true,会清除标记位的值
4.最后代码验证下
结果完全符合逾期。。。。
BillDavidup: 线程放线程池里对比下吧
猫猫大神: 牛皮的一批