有两种方法可以停止正在运行的线程: 1、Thread.stop()方法:暴力停止方法,无法保证线程内部业务的原子性,且方法已过期,不建议使用;stop方法可以让线程A终止线程B,这可能会让对象处于不一致状态;
2、Thread.interrupt()方法:线程调用interrupt()会生成一个中断标记, 但不会终止线程,仅可以给我们用来判断什么时候该干什么活,具体什么时候终止线程由业务自行在线程逻辑中通过 isInterrupted() 判断是否存在中断标记并做对应业务处理;
一、Thread.stop():
package com.thread; public class StopThread { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new TestThread()); t1.start(); Thread.sleep(2500); t1.stop(); } static class TestThread implements Runnable { @Override public void run() { for (int i = 0; i < 100000; i++) { System.out.println("线程执行 ------ " + i); try { Thread.sleep(1000); } catch (InterruptedException e) {} System.out.println("线程休眠后继续执行 ----- " + i); } } } }输出结果:
如上截图,调用stop()方法时暴力中断业务,导致第三次循环中的业务中断 “线程休眠后继续执行 ----- 2”的日志未打印;
二、Thread.interrupt()
package com.thread; public class StopThread extends Thread { public static void main(String[] args) throws InterruptedException { StopThread t1 = new StopThread(); t1.start(); Thread.sleep(50); t1.interrupt(); } @Override public void run() { for (int i = 0; i < 100000; i++) { if (this.isInterrupted()) { System.out.println(" 线程中断 ----- " + i); return; // throw new InterruptedException(); } System.out.println("线程执行 ------ " + i); } } }输出结果: