一、线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
二、为什么要用线程池:
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_OBJECT
public:
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"));
}
}