📚 分类
多线程
🕵🏽‍♀️ 问题描述
如何停止一个正在运行的线程?
👨‍🏫 问题讲解
❒ 有三种方式可以停止线程

✔ 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

public class ServerThread extends Thread {

    // volatile修饰符用来保证其它线程读取的总是该变量的最新的值
    public volatile boolean exit = false; 
 
    @Override
    public void run() {
        ServerSocket serverSocket = new ServerSocket(8080);
        while(!exit){
            serverSocket.accept(); // 阻塞等待客户端消息
        }
    }
    
    public static void main(String[] args) {
        ServerThread t = new ServerThread();
        t.start();
        t.exit = true; // 修改标志位,退出线程
    }
}

✔ 使用stop方法强行终止(不推荐,方法已作废)
  ▣ 调用stop()方法会立刻停止run()方法中剩余的全部工作,包括在catch或finally语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
  ▣ 调用stop()方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。

✔ 使用interrupt方法中断线程
  ▣ 打断阻塞的线程(sleep,wait,join)的线程,线程会抛出InterruptedException异常
  ▣ 打断正常的线程,可以根据打断状态来标记是否退出线程
🏳️‍🌈 问题总结
❒ 在Java中有以下3种方法可以终止正在运行的线程:

✔ 使用退出标志,使线程正常退出,也就是当run()方法完成后线程中止。
✔ 使用stop()方法强行终止线程,但是不推荐使用这个方法,该方法已被弃用。
✔ 使用interrupt方法中断线程。
📖 问题信息
📈 浏览次数:5 | 📅 更新时间:2025-12-01 22:02:20
📦 创建信息
🏷️ ID:102 | 📅 创建时间:2024-12-16 09:17:57