尝试总结下。
一.关于线程中断的
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