结束线程

tim-qtp...大约 1 分钟Java基础集合

1. 使用标志位(推荐方法)

这是最安全和推荐的方法,通过设置一个标志变量来控制线程是否继续执行。

public class MyThread extends Thread {
    private volatile boolean running = true;

    public void run() {
        while (running) {
            // 线程工作代码
        }
    }

    public void stopThread() {
        running = false;
    }
}

// 使用示例
MyThread thread = new MyThread();
thread.start();

// 当需要停止线程时
thread.stopThread();

注意:volatile关键字确保多线程环境下对running变量的可见性。

2. 使用Thread.interrupt()方法

public class MyThread extends Thread {
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                // 线程工作代码
            } catch (InterruptedException e) {
                // 当线程在wait/sleep/join时被中断
                Thread.currentThread().interrupt(); // 重新设置中断状态
                break;
            }
        }
    }
}

// 使用示例
MyThread thread = new MyThread();
thread.start();

// 当需要停止线程时
thread.interrupt();

3. 不要使用的方法(已废弃)

  • Thread.stop() - 已废弃,可能导致对象状态不一致

最佳实践

  1. 使用标志位或interrupt()方法
  2. 确保线程能够响应停止请求(避免长时间阻塞操作)
  3. 清理资源(在停止前释放锁、关闭文件等)
  4. 考虑使用Java并发包中的ExecutorService,它提供了更优雅的线程管理方式
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
    // 线程任务
});

// 停止线程池
executor.shutdown(); // 温和关闭,它不再接受新的任务,但会继续执行已经提交的任务(包括在队列中的任务)
executor.shutdownNow(); // 立即尝试停止所有任务