有三种方式可以停止线程
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止
- 使用stop方法强行终止(不推荐,方法已作废)
- 使用interrupt方法中断线程
① 使用退出标志,使线程正常退出。
public class MyInterrupt1 extends Thread { volatile boolean flag = false ; // 线程执行的退出标记 @Override public void run() { while(!flag) { System.out.println("MyThread...run..."); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { // 创建MyThread对象 MyInterrupt1 t1 = new MyInterrupt1() ; t1.start(); // 主线程休眠6秒 Thread.sleep(6000); // 更改标记为true t1.flag = true ; } }
② 使用stop方法强行终止
public class MyInterrupt2 extends Thread { volatile boolean flag = false ; // 线程执行的退出标记 @Override public void run() { while(!flag) { System.out.println("MyThread...run..."); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { // 创建MyThread对象 MyInterrupt2 t1 = new MyInterrupt2() ; t1.start(); // 主线程休眠2秒 Thread.sleep(6000); // 调用stop方法 t1.stop(); } }
③ 使用interrupt方法中断线程。
public class MyInterrupt3 { public static void main(String[] args) throws InterruptedException { //1.打断阻塞的线程 /*Thread t1 = new Thread(()->{ System.out.println("t1 正在运行..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } }, "t1"); t1.start(); Thread.sleep(500); t1.interrupt(); System.out.println(t1.isInterrupted());*/ //2.打断正常的线程 Thread t2 = new Thread(()->{ while(true) { Thread current = Thread.currentThread(); boolean interrupted = current.isInterrupted(); if(interrupted) { System.out.println("打断状态:"+interrupted); break; } } }, "t2"); t2.start(); Thread.sleep(500); // t2.interrupt(); } }