如何正确停止线程?

本文讲解了在Java中如何优雅地停止线程,避免使用已弃用的stop()方法,转而采用interrupt()方法结合线程内部状态检查的方式,确保线程安全且资源得到妥善释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

jdk1.2以前我们使用stop()停止一个线程,但是由于stop强制性的立即释放所有资源,非常不安全,1.2后这个方法已经不推荐使用,而后新加入interrupte()方法

interrupte()方法的使用

interrupte()方法会将线程的中断标志设置为true,但是这并不会让线程停止,它会继续正常执行,想让线程停止,我们需要在线程的run方法中加入对中断标志的检验,自行进行中断处理,因为,最了解自己的永远是自己,只有自己知道停止线程后该释放什么资源以达到优雅的退场的目的:

@Test
    public void interruptTest()
    {
        Thread thread1 = new Thread(() ->
        {
            for (int i = 1;; i++)
            {
                if (Thread.currentThread().isInterrupted())
                {
                    System.out.println("我中断了");
                    //释放资源
                    return;
                }
                System.out.println(i);
            }
        });
        thread1.start();
        System.out.println(Thread.currentThread().isInterrupted());
        try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        thread1.interrupt();
    }

所以如何正确的停止线程? 非interrupte莫属,非自身处理莫属。

在Qt中,正确停止和销毁线程是非常关键的,特别是在使用QThread类时。以下是一些步骤来确保线程安全的操作: 1. **设置信号与槽**: - 创建一个信号(如`stopThread()`)用于从主线程发送到子线程请求停止。 - 在子线程的构造函数中连接这个信号到一个槽函数,该函数负责执行清理工作。 ```cpp class WorkerThread : public QThread { public: explicit WorkerThread(QObject* parent = nullptr) : QThread(parent), m_stop(false) {} void stop() { m_stop = true; emit stopThread(); } protected: virtual void run() override { while (!m_stop) { // 执行任务 } // 清理工作 ... } signals: void stopThread(); private: bool m_stop; }; ``` 2. **检查停止标志**: 在子线程的run()函数中,每次循环开始之前检查`m_stop`标记,如果为true则退出循环。 3. **使用QWaitCondition**或`std::mutex`配合`std::condition_variable`: 如果清理工作可能阻塞,你可以使用这些工具同步主线程和子线程。例如,在完成清理后释放资源并唤醒等待的主线程: ```cpp void cleanUp() { // 执行清理操作 mutex.lock(); if (m_stop) { condition.notify_one(); // 唤醒主线程 } else { condition.wait(mutex); // 主线程等待直到通知 } mutex.unlock(); } ``` 4. **在退出线程前调用终止函数**: 使用`QThread::quit()`告诉Qt线程结束,然后调用`QThread::wait()`来等待子线程真正结束。如果没有调用`wait()`,那么子线程可能会意外地被系统终止。 ```cpp void WorkerThread::stop() { m_stop = true; emit stopThread(); } ~WorkerThread() { quit(); wait(); // 确保线程完全停止和清理后再离开 } ``` **相关问题--:** 1. Qt中如何定义和发射信号来控制线程? 2. 如何使用条件变量处理主线程和子线程间的通信? 3. `QThread`的生命周期管理有哪些需要注意的地方? 4. 为什么要先调用`quit()`再调用`wait()`来关闭线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值