关于Thread的中断解释

尝试总结下。

一.关于线程中断的

Thread类中有3个关于中断的方法对外方法,一个是静态的,二个是对象的,分别如下:

public void interrupt()

public boolean isInterrupted() {

public static boolean interrupted()

在Thread类中有一个私有的成员变量:
private Object blockerLock = new Object();
该类是记录线程是因为哪个对象而被锁住的,在LockSupport类中有对此变量的设置.

上述2种方法的用处如下:

对于方法一:在jdk的源码注释中可以看到,只是对该线程设置一个interrupt标志位为TRUE,至于线程是直接终端线程还是忽略还是别的操作,就要看
具体的代码实现了.

对于方法二和方法三,都是判断线程的interrupt标志的方法,区别在于对象方法不会更改线程的interrupt的标志,但是静态方法会更改这个标志.

中断示例代码:

package com.keji.haibo;
public class InterruptTest {
public static void main(String [] args){
Thread t1=new Thread(new Runnable(){
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()+":"+Thread.currentThread().isInterrupted());
System.out.println(Thread.currentThread().getName()+":"+Thread.currentThread().isInterrupted());

System.out.println(Thread.currentThread().getName()+":"+Thread.interrupted());
System.out.println(Thread.currentThread().getName()+":"+Thread.interrupted());
System.out.println(Thread.currentThread()+"......wakeUpChildThread");
}
}
});
t1.start();
t1.interrupt();

Thread.currentThread().interrupt();

System.out.println("MainClass:"+Thread.currentThread().getName()+":"+Thread.currentThread().isInterrupted());
System.out.println("MainClass:"+Thread.currentThread().getName()+":"+Thread.currentThread().isInterrupted());

System.out.println("MainClass:"+Thread.currentThread().getName()+":"+Thread.interrupted());
System.out.println("MainClass:"+Thread.currentThread().getName()+":"+Thread.interrupted());
}
}
代码输出:
MainClass:main:true
MainClass:main:true
MainClass:main:true
MainClass:main:false
Thread-0:false
Thread-0:false
Thread-0:false
Thread-0:false
Thread[Thread-0,5,main]......wakeUpChildThread

这里例子主要是说明调用interrupt()方法具体会产生什么影响,调用interrupt()方式是设置对应的线程的中断标志,
至于被调用线程的动作,如果是正在阻塞,那么就抛出InterruptedException并且退出阻塞,Interrupt标志也会清除。如果正在运行,那么就看程序是怎么写的了
下面这个回答很清晰的说明了interrupt()方法的效果
https://www.zhihu.com/question/41048032
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值