1. 线程正常的退出,也就是给定退出条件 / 退出标志,当 run 方法执行完自动退出。
2. 调用 stop()方法使线程强制退出,这种方式太暴力了并不推荐,而且不安全。
1. 比如线程 A 调用 stop()方法停止线程 B,线程 A 并不知道线程 B 的工作情况直接停止,可能会导致线程 B 的一些清理工作无法完成。
2. 还有一种情况是,线程 A 调用 stop()方法终止了线程 B,线程 B 释放锁,最终造成数据不一致的情况。
基于上述的问题,stop()方法已经被废弃了,类似的方法还有 suspend()、resume()方法。
3. 目前使用 interrupt()方法来中断线程。
interrupt()方法实际上也不是中断线程,而是通知线程应该中断了,具体还得线程根据具体情况来判断什么时候中断线程。
class MyThread extends Thread { volatile boolean stop = false; public void run() { while (!stop) { System.out.println(getName() + " is running"); try { sleep(1000); } catch (InterruptedException e) { System.out.println("week up from blcok..."); stop = true; // 在异常处理代码中修改共享变量的状态 } } System.out.println(getName() + " is exiting..."); } } class InterruptThreadDemo3 { public static void main(String[] args) throws InterruptedException { MyThread m1 = new MyThread(); System.out.println("Starting thread..."); m1.start(); Thread.sleep(3000); System.out.println("Interrupt thread...: " + m1.getName()); m1.stop = true; // 设置共享变量为true m1.interrupt(); // 阻塞时退出阻塞状态 Thread.sleep(3000); // 主线程休眠3秒以便观察线程m1的中断情况 System.out.println("Stopping application..."); } }