多线程任务队列实现

如题所述

第1个回答  2022-07-24
我们在应用程序中, 要完成一些异步工作, 同时在异步工作中又要尽量少用switch case, 这时task任务继承方式就可以达到效果。我们可以在作业队列中分配或添加任务,然后作业队列负责完成任务。这里的工作队列可以是多线程的,也可以是单线程的。本文采用的是多线程的实现,单线程的可以留言给我。

设计一个多线程就可以参照线程池的框架, 它要包含几个部分:
a. 线程池管理器:用于创建并管理线程池
b. 工作线程: 线程池中实际执行的线程
c. 任务接口:将任务抽象出来,形成任务接口,从而可以通过继承来实现自己要做的事
d. 任务队列:这里是通过个queue来保存。

本文完成的工作队列是以跨平台为前提, 可以在多个平台上运行。并具有以下一些特点:
a. 作业队列是可以单线程也可以多线程
b. 作业队列有优先级,具有高优先级的作业将在队列中具有较低优先级的作业之前添加。因此,它们将在其他较低优先级作业之前处理。
c. 作业队列可以暂停,因此暂停时不能处理新作业。但是用户仍然可以将作业添加到队列中。一旦用户选择恢复作业队列,作业将被处理。

我们实现的通用线程池框架由五个重要部分组成ZLThread,ZLWorkerThread,ZLThreadManager,ZLThreadPool,ZLTask,除此之外框架中还包括线程同步使用的类ZLMutex和ZLCondition,其中重要部分的大体联系如下图:

a. ZLTask是所有的任务的基类,其提供一个接口DoTaskProc,所有的任务类都必须从该类继承,同时实现DoTaskProc方法。该方法中实现具体的任务逻辑。
b. ZLThread是线程的类抽象,其封装了各个系统线程最经常使用的属性和方法,是所有线程类的基类,具有一个接口Run。
c. ZLWorkerThread是实际被调度和执行的线程类,其从ZLThread继承而来,实现了ZLThread中的Run方法。
d. ZLThreadPool是线程池类,其负责保存线程,释放线程以及调度线程。
e. ZLThreadManager是线程池与用户的直接接口,其屏蔽了内部的具体实现。
f. ZLMutex用于线程之间的互斥。
g. ZLCondition则是条件变量的封装,用于线程之间的同步。

把线程与task任务进行统一管理,创建有限的线程数来处理task任务,如下图:

从图上可以看出主要含有三个队列,任务队列,工作线程队列,忙碌线程队列;任务队列是一个阻塞队列,任务不断地被push进来,这里要有一个线程来取任务,获取空闲线程, 交于空闲线程去处理,如果获取到任务,则将线程会进入忙碌线程队列中,执行任务的DoTaskProc工作,当工作完成,重新移出工作线程队列。

http://blog.csdn.net/ithzhang/article/details/9020283

开源: https://git.coding.net/clzhan/MulitiThreadJob.git