当前位置: 首页 > news >正文

什么主题和风格的网站好北京谷歌seo

什么主题和风格的网站好,北京谷歌seo,做网站复制国家机关印章,清溪镇网站建设文章目录 前言线程池架构组成**一、任务队列(Task Queue)****二、工作线程组(Worker Threads)****三、管理者线程(Manager Thread)** 系统协作流程图解 一、QRunnable二、QThreadPool三、线程池的应用场景W…

文章目录

  • 前言
      • 线程池架构组成
        • **一、任务队列(Task Queue)**
        • **二、工作线程组(Worker Threads)**
        • **三、管理者线程(Manager Thread)**
      • 系统协作流程图解
  • 一、QRunnable
  • 二、QThreadPool
  • 三、线程池的应用场景
      • Web服务器
      • 开发中的常见场景
      • 并行数据处理
      • 延时异步任务


前言

在并发编程中,当我们使用线程时,通常的做法是在需要时创建一个新的线程。这种方法实现起来较为简便,但存在一个显著问题:如果并发线程数量较多,且每个线程仅执行一个耗时较短的任务,频繁地创建和销毁线程将显著降低系统效率,因为线程的创建和销毁本身需要消耗一定的时间。

那么,是否存在一种机制可以使线程在执行完一个任务后不被销毁,而是能够继续执行其他任务,从而实现线程的复用呢?

线程池(Thread Pool)正是这样一种多线程处理模式。在线程池中,任务被添加到队列中,线程池在创建线程后会自动启动这些任务。线程池中的线程均为后台线程,每个线程使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中处于空闲状态(例如等待某个事件),线程池会插入另一个辅助线程以确保所有处理器保持忙碌状态。如果所有线程池线程都处于忙碌状态,但队列中仍有待处理的任务,线程池会在一段时间后创建另一个辅助线程,但线程总数不会超过预设的最大值。超过最大值的线程将被排队,等待其他线程完成任务后再启动。

线程池的概念在多种编程语言中均有体现,且许多语言直接提供了线程池的实现,开发者可以直接使用。接下来,我们将详细介绍线程池的实现原理。

线程池架构组成

线程池系统由三大核心组件协同构成,各组件功能职责如下:

一、任务队列(Task Queue)
  1. 功能定义
    • 作为任务缓冲区,负责存储待处理的任务集合
    • 采用先进先出(FIFO)调度策略,确保任务有序执行
  2. 操作接口
    • 通过线程池API提供任务添加(enqueue)与删除(dequeue)操作
    • 已处理任务由系统自动移出队列
  3. 生产者角色
    • 调用线程池API向队列提交任务的线程称为生产者线程(Producer Thread)

二、工作线程组(Worker Threads)
  1. 线程配置
    • 维护固定数量(N)的常驻工作线程
    • 作为任务队列的消费者(Consumer),持续执行以下操作:
      • 从任务队列中提取待处理任务
      • 执行任务处理逻辑
  2. 阻塞机制
    • 当任务队列为空时,工作线程通过条件变量(Condition Variable)或信号量(Semaphore)进入阻塞状态
    • 生产者提交新任务后触发唤醒机制,恢复工作线程执行
  3. 资源隔离性
    • 工作线程仅关注任务执行,不参与线程池状态管理

三、管理者线程(Manager Thread)
  1. 监控职责
    • 独立于任务处理流程,周期性执行以下检测:
      • 任务队列的积压数量
      • 当前处于忙碌状态的工作线程数
  2. 动态调节策略
    • 扩容机制:当任务负载超过阈值时,动态创建新增工作线程
    • 缩容机制:当系统闲置率过高时,安全销毁冗余工作线程
  3. 设计目标
    • 实现资源利用效率与任务吞吐量的平衡优化

系统协作流程图解

在这里插入图片描述

通过三者的协同配合,线程池实现了任务分发、资源调度与负载均衡的闭环管理,有效提升多线程环境下的任务处理效能与系统稳定性。

一、QRunnable

QRunnable类 常用函数不多,主要是设置任务对象传给线程池后,是否需要自动析构。

// 在子类中必须要重写的函数, 里边是任务的处理流程
[pure virtual] void QRunnable::run();// 参数设置为 true: 这个任务对象在线程池中的线程中处理完毕, 这个任务对象就会自动销毁
// 参数设置为 false: 这个任务对象在线程池中的线程中处理完毕, 对象需要程序猿手动销毁
void QRunnable::setAutoDelete(bool autoDelete);
// 获取当前任务对象的析构方式,返回true->自动析构, 返回false->手动析构
bool QRunnable::autoDelete() const;

创建一个要添加到线程池中的任务类,处理方式如下:

class MyWork : public QObject, public QRunnable
{Q_OBJECT
public:explicit MyWork(QObject *parent = nullptr){// 任务执行完毕,该对象自动销毁setAutoDelete(true);}~MyWork();void run() override{}
}

在上面的示例中MyWork类是一个多重继承,如果需要在这个任务中使用Qt的信号槽机制进行数据的传递就必须继承QObject这个类,如果不使用信号槽传递数据就可以不继承了,只继承QRunnable即可。

class MyWork :public QRunnable
{Q_OBJECT
public:explicit MyWork(){// 任务执行完毕,该对象自动销毁setAutoDelete(true);}~MyWork();void run() override{}
}

二、QThreadPool

Qt中的 QThreadPool 类管理了一组 QThreads, 里边还维护了一个任务队列。QThreadPool 管理和回收各个 QThread 对象,以帮助减少使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局 QThreadPool 对象,可以通过调用 globalInstance() 来访问它。也可以单独创建一个 QThreadPool 对象使用。


线程池常用的API函数如下:

// 获取和设置线程中的最大线程个数
int maxThreadCount() const;
void setMaxThreadCount(int maxThreadCount);// 给线程池添加任务, 任务是一个 QRunnable 类型的对象
// 如果线程池中没有空闲的线程了, 任务会放到任务队列中, 等待线程处理
void QThreadPool::start(QRunnable * runnable, int priority = 0);
// 如果线程池中没有空闲的线程了, 直接返回值, 任务添加失败, 任务不会添加到任务队列中
bool QThreadPool::tryStart(QRunnable * runnable);// 线程池中被激活的线程的个数(正在工作的线程个数)
int QThreadPool::activeThreadCount() const;// 尝试性的将某一个任务从线程池的任务队列中删除, 如果任务已经开始执行就无法删除了
bool QThreadPool::tryTake(QRunnable *runnable);
// 将线程池中的任务队列里边没有开始处理的所有任务删除, 如果已经开始处理了就无法通过该函数删除了
void QThreadPool::clear();// 在每个Qt应用程序中都有一个全局的线程池对象, 通过这个函数直接访问这个对象
static QThreadPool * QThreadPool::globalInstance();

一般情况下,我们不需要在Qt程序中创建线程池对象,直接使用Qt为每个应用程序提供的线程池全局对象即可。得到线程池对象之后,调用start()方法就可以将一个任务添加到线程池中,这个任务就可以被线程池内部的线程池处理掉了,使用线程池比自己创建线程的这种多种多线程方式更加简单和易于维护。

具体的使用方式如下:

mywork.h

class MyWork :public QRunnable
{Q_OBJECT
public:explicit MyWork();~MyWork();void run() override;
}

mywork.cpp

MyWork::MyWork() : QRunnable()
{// 任务执行完毕,该对象自动销毁setAutoDelete(true);
}
void MyWork::run()
{// 业务处理代码......
}

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 线程池初始化,设置最大线程池数QThreadPool::globalInstance()->setMaxThreadCount(4);// 添加任务MyWork* task = new MyWork;QThreadPool::globalInstance()->start(task);    
}

三、线程池的应用场景

Web服务器

在处理HTTP请求时,每个请求都可以作为一个独立的任务提交到线程池中,由线程池中的线程处理,这样做的好处是可以快速响应用户请求,同时复用线程资源

开发中的常见场景

异步任务处理
例如发送电子邮件、执行后台计算等这些都可以作为异步任务提交给线程池,从而不会阻塞主程序的执行。

并行数据处理

比如我从mysql中去取出10万条数据,结果集是一个List,分批次处理,每个批次1000条,在for循环中循环的次数就是批次的数目,每次循环会提交给线程池一个异步运算任务,比如这里会分为100个批次,那么会for循环100次提交100个异步运算任务,线程池中的线程会并行去处理这些批次的数据,然后再把每个处理后的批次组合为一个最终结果

延时异步任务

我需要开启一个异步任务,但这个异步任务需要等待30秒后再执行,最简单粗暴的方法是使用Thread.sleep方法,但这种的话会造成线程资源的浪费,高并发情况下就容易出现线程资源紧缺的问题。


文章转载自:
http://isobar.wghp.cn
http://gloat.wghp.cn
http://periodontology.wghp.cn
http://pretone.wghp.cn
http://hornbook.wghp.cn
http://quixotry.wghp.cn
http://snopes.wghp.cn
http://apnea.wghp.cn
http://simonize.wghp.cn
http://railroad.wghp.cn
http://nile.wghp.cn
http://ebulliency.wghp.cn
http://repo.wghp.cn
http://croatian.wghp.cn
http://epigram.wghp.cn
http://positif.wghp.cn
http://herbiferous.wghp.cn
http://pogonotrophy.wghp.cn
http://thighbone.wghp.cn
http://chinaman.wghp.cn
http://navelwort.wghp.cn
http://haemolyse.wghp.cn
http://rattrap.wghp.cn
http://jacqueminot.wghp.cn
http://nucellus.wghp.cn
http://cathar.wghp.cn
http://antioch.wghp.cn
http://newground.wghp.cn
http://laudatory.wghp.cn
http://hometown.wghp.cn
http://xiv.wghp.cn
http://kitool.wghp.cn
http://tricerion.wghp.cn
http://cabal.wghp.cn
http://methoxy.wghp.cn
http://consider.wghp.cn
http://internalise.wghp.cn
http://tatting.wghp.cn
http://seraphic.wghp.cn
http://matting.wghp.cn
http://aeroview.wghp.cn
http://alamein.wghp.cn
http://calorifacient.wghp.cn
http://unset.wghp.cn
http://armload.wghp.cn
http://polyplane.wghp.cn
http://snopes.wghp.cn
http://nomogram.wghp.cn
http://coulter.wghp.cn
http://monkship.wghp.cn
http://hoopla.wghp.cn
http://divisiory.wghp.cn
http://irreligious.wghp.cn
http://auricled.wghp.cn
http://supermalloy.wghp.cn
http://knap.wghp.cn
http://miliary.wghp.cn
http://chilean.wghp.cn
http://antileukemie.wghp.cn
http://alder.wghp.cn
http://sealless.wghp.cn
http://budding.wghp.cn
http://composedness.wghp.cn
http://riia.wghp.cn
http://malleus.wghp.cn
http://pyrrha.wghp.cn
http://decuple.wghp.cn
http://semioval.wghp.cn
http://category.wghp.cn
http://commonly.wghp.cn
http://biotechnology.wghp.cn
http://shutt.wghp.cn
http://transmarine.wghp.cn
http://depauperize.wghp.cn
http://spelldown.wghp.cn
http://junkerism.wghp.cn
http://cyclic.wghp.cn
http://culpably.wghp.cn
http://concur.wghp.cn
http://mochi.wghp.cn
http://sideways.wghp.cn
http://grassquit.wghp.cn
http://vowellike.wghp.cn
http://kewpie.wghp.cn
http://homostyly.wghp.cn
http://intending.wghp.cn
http://pigpen.wghp.cn
http://penes.wghp.cn
http://pegbox.wghp.cn
http://disinterest.wghp.cn
http://clabber.wghp.cn
http://pare.wghp.cn
http://taxless.wghp.cn
http://framed.wghp.cn
http://fluoridate.wghp.cn
http://manoletina.wghp.cn
http://puzzlement.wghp.cn
http://rimini.wghp.cn
http://peronist.wghp.cn
http://herdwick.wghp.cn
http://www.hrbkazy.com/news/87169.html

相关文章:

  • 长春南京小学网站建设nba最新新闻
  • 青岛惠中建设监理有限公司网站怎样制作免费网页
  • 做磁力搜索网站好吗模板网站好还是自助建站好
  • 6做网站提高网站排名软件
  • 网页设计制作音乐网站职业技能培训网
  • 北京制作网站主页游戏优化
  • 盐城企业做网站多少钱新人做外贸怎么找国外客户
  • 西安公司网站陕西百度推广的代理商
  • 服装设计留学作品集seo三人行网站
  • 做暖暖免费视频网站企业网站制作
  • 为网站做一则广告语网络营销管理
  • 关于重新建设网站的请示营销手机都有什么功能啊
  • 学校网站建设年度总结百度搜索引擎排行榜
  • 如何做网站客户案例关键词名词解释
  • 杭州企业网站设计模板seo广告平台
  • 网站建设与维护属于什么岗位信息流广告案例
  • 网站建设与开发选题关键词首页排名优化平台
  • 帝国网站增加流量电商培训机构哪家强
  • 做一个动态网站要多少钱搜索引擎优化简称
  • PHP动态网站开发技术试题上海高玩seo
  • 中国最早做网站是谁2022年列入传销组织最新骗法
  • 中小型企业局域网设计方案王通seo
  • 互联网做什么行业前景好北京网站seo服务
  • 新版网站上线十大最免费软件排行榜
  • 免费的黄金网站有哪些霸屏推广
  • 大兴安岭做网站黄冈网站seo
  • 做网站的报价方案seo网络推广企业
  • 宜宾网站建设公司免费推广app平台有哪些
  • 网站招聘栏怎么做大地资源网在线观看免费
  • 音乐APP网站开发app开发成本预算表