关于java.lang.ThreadDeath线程发生场景及模拟代码测试
当调用stop()方法时会发生两件事:
1.即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
2.会立即释放该线程所持有的所有的锁,导致数据得不到同步的处理,出现数据不一致的问题。
package com.java.thread.p4;
public class StopDemo {
public static class MyThread extends Thread{
@Override
public void run() {
try {
System.out.println("线程逻辑开始");
super.run();
for(int i = 0; i < 5000; i ++){
System.out.println(i);
sleep(100);
}
System.out.println("线程逻辑结束");
} catch (InterruptedException e) {
System.out.println("捕获到了 InterruptedException 异常 , 进入了 catch 代码块");
e.printStackTrace();
}catch (ThreadDeath e){
System.out.println("捕获到了 ThreadDeath 异常 , 进入了 catch 代码块");
e.printStackTrace();
}//catch代码块
System.out.println("run 方法结束");
}//run方法
}//线程
public static void main(String[] args) throws InterruptedException {
MyThread thread = new MyThread(); //新建线程
thread.start(); //线程启动
Thread.sleep(500); //沉睡 500ms, 让线程打印 5 个数字
thread.stop(); //中断线程
System.out.println("主线程中断线程");
}
}
控制台输出信息
线程逻辑开始
0
1
2
3
4
捕获到了 ThreadDeath 异常 , 进入了 catch 代码块
主线程中断线程
run 方法结束
java.lang.ThreadDeath
at java.lang.Thread.stop(Thread.java:853)
at com.java.thread.p4.StopDemo.main(StopDemo.java:31)