深入挖掘Thread.interrupt
2018-10-18 本文已影响0人
enjoycc97
如果想中断一个线程或者停止,通常使用interrupt操作,但是这个函数有什么用。
中止一个线程?如果线程正在运行,下一个线程还在运行吗?
public static final void main(String [] args) {
Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("start");
int i=0;
while(i==0) {
}
System.out.println("end");
}
});
t.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.interrupt();
}
运行上述代码,发现并没有预期中止线程,是interrupt不生效吗。
查看java doc这个函数一方面是设置interrupted设置为true,
Thread.interrupt()会为true 本身判断会清除标志位
另一方面,像wait sleep join这些阻塞会被唤醒。同时触发异常
测试代码如下。会打印异常信息。
public class Learn {
public static final void main(String [] args) {
Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("start"+Thread.interrupted());
int i=0;
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("after"+Thread.interrupted());
System.out.println("end");
}
});
t.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.interrupt();
System.out.println(t.interrupted());
}
}
触发打印异常,说明interrupt触发sleep的异常唤醒