一、方式11.继承QThread重写run()方法:1)QThread 是底层线程管理类,默认run()会调用exec()开启线程事件循环;2)重写run()函数,调用start()启动线程。2.测试CustomThread.h#ifndef CUSTOMTHREAD_H #define CUSTOMTHREAD_H #include QThread #include QObject #include QDebug //自定义线程类 class CustomThread : public QThread { Q_OBJECT protected: void run() override { qDebug() 继承QThread 子线程ID: QThread::currentThreadId(); //模拟耗时任务 msleep(1000); emit taskFinish(); } signals: void taskFinish(); }; #endif // CUSTOMTHREAD_Hmain.cpp#include QCoreApplication #include QThread #include QRunnable #include QThreadPool #include QtConcurrent/QtConcurrent #include QDebug #include thread #include chrono #include CustomThread.h //在main中调用 void demo_QThread_Inherit() { CustomThread t; QObject::connect(t, CustomThread::taskFinish, [](){ qDebug() 继承QThread任务执行完毕; }); t.start(); //启动子线程 t.wait(); //主线程阻塞等待线程结束 } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main start; qDebug() 主线程ID QThread::currentThreadId(); demo_QThread_Inherit(); qDebug() main end; return 0; //return a.exec(); }二、方式21.QObject moveToThread():1)创建纯业务工作类(Worker)继承QObject,通过moveToThread(thread)将整个对象移动到子线程事件循环;2)通过信号槽跨线程通信(Qt 自动队列连接),保证槽函数在子线程执行。2.测试Worker.h#ifndef WORKER_H #define WORKER_H #include QObject #include QThread #include QDebug //工作对象(纯业务无线程继承) class Worker : public QObject { Q_OBJECT public slots: void doTask(int num) { qDebug() moveToThread 子线程ID: QThread::currentThreadId() 参数: num; QThread::msleep(1000); emit taskDone(num * 2); } signals: void taskDone(int res); }; #endif // WORKER_Hmain.cpp#include QCoreApplication #include QThread #include QRunnable #include QThreadPool #include QtConcurrent/QtConcurrent #include QDebug #include thread #include chrono #include Worker.h //在main中调用 void demo_moveToThread() { QThread* workThread new QThread; Worker* worker new Worker; worker-moveToThread(workThread); //任务启动 QObject::connect(workThread, QThread::started, worker, [worker](){ worker-doTask(100); }); //任务完成,退出线程 QObject::connect(worker, Worker::taskDone,[](int res) { qDebug() moveToThread 函数执行完毕 res: res; }); //清理内存 QObject::connect(workThread, QThread::finished, worker, QObject::deleteLater); QObject::connect(workThread, QThread::finished, workThread, QObject::deleteLater); //开启线程 workThread-start(); workThread-quit(); workThread-wait(); //正确阻塞等待线程完全结束 } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main start; qDebug() 主线程ID QThread::currentThreadId(); demo_moveToThread(); qDebug() main end; return 0; //return a.exec(); }三、方式31.QThreadPool QRunnable:1)QRunnable封装单次任务,QThreadPool 复用线程避免反复创建销毁线程开销;2)globalInstance() 使用全局共享线程池也可创建局部独立线程池;3)默认自动销毁 QRunnable(autoDeletetrue)。2.测试main.cpp#include QCoreApplication #include QThread #include QRunnable #include QThreadPool #include QtConcurrent/QtConcurrent #include QDebug #include thread #include chrono //任务封装类 class RunTask : public QRunnable { public: explicit RunTask(int id) : m_id(id) {} void run() override { qDebug() QThreadPool 任务 m_id 线程ID: QThread::currentThreadId(); QThread::msleep(800); } private: int m_id; }; //在main中调用 void demo_QRunnable_Pool() { QThreadPool* pool QThreadPool::globalInstance(); pool-setMaxThreadCount(4); //设置最大并发线程 //提交5个任务自动复用线程 for(int i 1; i 5; i) { pool-start(new RunTask(i)); //autoDelete默认true执行完自动释放 } pool-waitForDone(); // 阻塞等待所有任务完成 qDebug() 线程池全部任务结束; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main start; qDebug() 主线程ID QThread::currentThreadId(); demo_QRunnable_Pool(); qDebug() main end; return 0; //return a.exec(); }四、方式41.QtConcurrent 高级并发API,需要添加在pro文件中concurrent模块:1)QtConcurrent模块提供高层并发函数,底层基于QThreadPool,无需手动管理线程;2)QtConcurrent::run运行任意函数或lamdba;3)QtConcurrent::map/filter/reduce批量容器并行运算;4)返回QFuture 用于等待/获取结果、进度监控。2.测试main.cpp#include QCoreApplication #include QThread #include QRunnable #include QThreadPool #include QtConcurrent/QtConcurrent #include QDebug #include thread #include chrono //普通耗时函数 int calcFunc(int a, int b) { qDebug() QtConcurrent 普通函数 子线程ID: QThread::currentThreadId(); QThread::msleep(1000); return a b; } void demo_QtConcurrent() { //异步执行函数 QFutureint future QtConcurrent::run(calcFunc, 111, 555); qDebug() 主线程不阻塞等待计算...; future.waitForFinished(); //阻塞等待结果 qDebug() QtConcurrent计算结果: future.result(); //Lambda版本 QFuturevoid lambdaTask QtConcurrent::run([](){ qDebug() QtConcurrent Lambda 子线程ID QThread::currentThreadId(); }); lambdaTask.waitForFinished(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main start; qDebug() 主线程ID QThread::currentThreadId(); demo_QtConcurrent(); qDebug() main end; return 0; //return a.exec(); }五、方式51.C原生std::thread(非Qt线程模型):1)直接使用C标准库std::thread,可运行lambda/普通函数。2.测试main.cpp#include QCoreApplication #include QThread #include QRunnable #include QThreadPool #include QtConcurrent/QtConcurrent #include QDebug #include thread #include chrono void stdThreadWork(int val) { qDebug() std::thread 子线程值: val; //阻塞当前线程2秒 std::this_thread::sleep_for(std::chrono::seconds(2)); } void demo_stdThread() { std::thread t1(stdThreadWork, 666); std::thread t2([](){ qDebug() std::thread lambda; }); t1.join(); //等待线程执行完毕 t2.join(); qDebug() std::thread全部结束; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main start; qDebug() 主线程ID QThread::currentThreadId(); demo_stdThread(); qDebug() main end; return 0; //return a.exec(); }