一、线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
二、为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
程序运行截图如下:
代码如下:
mytask.h
#ifndef MYTASK_H
#define MYTASK_H#include <QRunnable>
class QListWidget;class MyTask : public QRunnable
{
public:MyTask(QListWidget *listWidget);~MyTask();int Create();void Destroy();private:void run();QListWidget *m_listWidget;
};#endif // MYTASK_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
class MyTask;
class QThreadPool;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void btnClicked();private:Ui::Widget *ui;MyTask *m_myTask[5];QThreadPool *m_pThreadPool;
};#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
mytask.cpp
#include "mytask.h"
#include <QDebug>
#include <QTime>
#include <QThread>
#include <QListWidget>
#include <QListWidgetItem>MyTask::MyTask(QListWidget *listWidget)
{m_listWidget=listWidget;QListWidgetItem *item=new QListWidgetItem;item->setTextColor(Qt::green);item->setText("MyTask created: this is 0x"+QString::number((unsigned int)this,16));m_listWidget->insertItem(0,item);
}MyTask::~MyTask()
{QListWidgetItem *item=new QListWidgetItem;item->setTextColor(Qt::red);item->setText("MyTask::~MyTask() called! this address is 0x"+QString::number((unsigned int)this,16));m_listWidget->insertItem(0,item);
}void MyTask::run()
{QListWidgetItem *item1=new QListWidgetItem;item1->setText("threadID:"+QString::number((unsigned int)QThread::currentThreadId(),16)+" this:"+QString::number((unsigned int)this,16));m_listWidget->insertItem(0,item1);for(int i=0;i<10;i++){QListWidgetItem *item=new QListWidgetItem;item->setText("threadID:"+QString::number((unsigned int)QThread::currentThreadId())+" i:"+QString::number(i));m_listWidget->insertItem(0,item);qDebug()<<"threadID:"<<QThread::currentThreadId()<<" i:"<<i<<" time:"<<QTime::currentTime().toString("HH:mm:ss");QThread::sleep(1);}
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mytask.h"
#include <QThreadPool>
#include <QListWidgetItem>
#include <QTime>
#include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);for(int i=0;i<5;i++){m_myTask[i]=new MyTask(ui->listWidget);}connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
}Widget::~Widget()
{delete ui;
}void Widget::btnClicked()
{m_pThreadPool=QThreadPool::globalInstance();if(m_pThreadPool){m_pThreadPool->setMaxThreadCount(3);m_pThreadPool->setExpiryTimeout(-1);for(int i=0;i<5;i++){m_pThreadPool->start(m_myTask[i]);}m_pThreadPool->waitForDone();QListWidgetItem *item1=new QListWidgetItem;item1->setTextColor(Qt::blue);item1->setText("m_pThreadPool->waitForDone() time:"+QTime::currentTime().toString("HH:mm:ss"));ui->listWidget->insertItem(0,item1);m_pThreadPool->clear();QListWidgetItem *item2=new QListWidgetItem;item2->setTextColor(Qt::red);item2->setText("m_pThreadPool->clear() time:"+QTime::currentTime().toString("HH:mm:ss"));}
}