一种基于线程池的任务分配方法
【技术领域】
[0001] 本发明属于多线程和队列领域,特别涉及一种基于线程池的任务分配方法。
【背景技术】
[0002] 随着信息技术和软件行业的不断发展,与之同时所承载的硬件资源也在飞速发 展,但人们对软件或应用的使用也在不断提出更高的要求,比如:性能、易用性等等,只有满 足了人们的使用需求,产品才能更具市场竞争力,企业才能走的更远。
[0003] 目前,对于线程任务的分配,一般是采用随意或不限制地创建线程的方式。但是, 由于每台计算机或终端的中央处理器(CPU)核心芯片是固定的,处理任务的线程数据也是 固定,过多或太少都不能发挥它的最大性能,这种方式必然会造成计算机或终端任务不饱 和或负载过重,以影响软件运行效率。因此,只有根据硬件的情况创建线程才能发挥中央处 理器的最大效能。
【发明内容】
[0004] 本发明的一个目的是解决至少上述问题或缺陷,并提供至少后面将说明的优点。
[0005] 本发明另一个目的是提供一种基于线程池的任务分配方法,以充分利用硬件资源 实现多任务并行执行,且对每个线程可重复使用的多线程任务分配方法,避免线程的创建 调用,以及创建调用线程所产生的资源浪费问题。
[0006] 本发明还有一个目的是根据计算机或终端当前CPU配置情况,自动创建合适的线 程数量,且线程的数量既能满足多任务并行执行的需求,也不会占用过多的处理器的空间, 充分提高线程的使用效率。
[0007] 为了实现根据本发明的这些目的和其它优点,提供了一种基于线程池的任务分配 方法,包括:
[0008] 步骤一,创建线程池和任务池;
[0009] 步骤二,预先确定一数量值n,初始化n个线程并将所述线程顺序存储至所述线程 池列队中;
[0010] 步骤三,接收任务后遍历所述线程池,若所述线程池中有空闲线程时,则从所述线 程池中顺序调取所述空闲线程并执行所述任务;若所述线程池中无空闲线程时,则将所述 任务顺次存储至所述任务池的列队中。
[0011] 预先初始化n个线程存储至线程池,当接收到任务后即从线程池中调取空闲线 程,充分利用现有硬件资源实现多任务并行执行,且对每个任务执行者可重复使用,以解决 软件运行的性能、易用性等问题,并且避免了线程的创建调用和切换所带来的资源浪费问 题。
[0012] 同时,当接收任务后先查找空闲线程,如果有空闲线程,则直接去执行任务,如果 没有空闲线程,再把任务放进任务池,等待空闲线程来执行。当存在空闲线程时,可以将任 务直接快速地分配至空闲线程,提高任务处理的速度和效率。
[0013] 优选的是,所述的基于线程池的任务分配方法中,根据处理器芯片的核数i确定 所述数值n;
[0014] 所述数量值n的计算公式为:n=i*2+2 ;
[0015] 其中,i表示处理器(CPU)芯片的核数;n表示初始化线程的个数。
[0016] 根据计算机或终端当前CPU配置情况,自动创建合适数量的线程,将这些线程存 放至线程池中,并且不对线程池中空闲线程进行删除。这些数量的线程既可以满足多任务 并行执行的要求,又不占用处理器的空间和资源,还可以避免再次创建线程所带来的资源 消耗。
[0017] 优选的是,所述的基于线程池的任务分配方法中,步骤三中接收任务后,还包括顺 序锁定所述线程池和所述任务池。线程运行属于异步运行,在高并发的情况下,两个或多个 线程同时去执行同一个任务是存在的。为了避免这种情况的发生,当接收任务后,对线程池 和任务池执行顺序锁定的操作。
[0018] 优选的是,所述的基于线程池的任务分配方法中,所述顺序锁定所述线程池和所 述任务池具体指:
[0019] 锁定所述线程池;
[0020] 锁定所述任务池;
[0021] 存在空闲线程时,当所述任务分配至所述空闲线程,将所述线程池和所述任务池 解锁;不存在空闲线程时,则将所述线程池和所述任务池解锁。
[0022] 为了避免死锁现象的出现,先锁定线程池,再锁定任务池。并且当任务分配至空闲 线程后,线程通过接口去执行该任务,或者当线程池中没有空闲线程时,将任务池和线程池 解锁,这样既可以避免两个或多个线程同时去执行同一个任务的情况,有可以避免死锁现 象的发生。
[0023] 优选的是,所述的基于线程池的任务分配方法中,所述线程执行完任务后,还包 括:
[0024] 遍历所述任务池;
[0025] 若所述任务池队列中有任务时,则从所述任务池队列中顺序调取所述任务并将该 任务分配至所述线程;所述线程执行该任务;
[0026] 若所述任务池中没有任务时,则所述线程返回至所述线程池队列中。当线程执行 完任务后,首先查找任务池中是否有未完成的任务,当有任务时,则该线程直接去执行任 务。实现线程的反复多次利用,提高线程的利用率。
[0027] 优选的是,所述的基于线程池的任务分配方法中,所述任务池每次只能容纳一个 所述线程。每次任务池只能有一个线程领取任务,以避免两个或多个线程领取同一个任务 的现象。
[0028] 优选的是,所述的基于线程池的任务分配方法中,所述线程进入所述任务池时,包 括:
[0029] 锁定所述线程池;
[0030] 锁定所述任务池;
[0031] 所述任务池中存在任务时,当所述任务分配至所述线程后,解锁所述线程池和所 述任务池;
[0032] 所述任务池中不存在任务时,解锁所述线程池和所述任务池。通过先锁定线程池, 再锁定任务池,以避免两个或多个线程同时领取同一个任务的情况的发送。当任务分配完 毕或任务池中没有未执行的任务时,才对任务池和线程池进行解锁。
[0033] 优选的是,所述的基于线程池的任务分配方法中,当所述线程池中只有一个线程 时;
[0034] 接收任务后,直接从所述线程池中调取所述线程执行该任务。将任务直接分配至 线程池中唯一的1个线程,提高任务执行的效率。
[0035] 本发明的有益效果如下:
[0036] 1、所述的基于线程池的任务分配方法中,充分利用线程资源,初始化预定数量的 线程用来实现多任务并行执行,并且每个线程可重复使用,避免线程的创建和调用,以及创 建调用线程所产生的资源浪费的问题。
[0037] 2、所述的基于线程池的任务分配方法中,根据中央处理器(CPU)的核数自动生成 合适数量的线程,这些线程既能满足多任务并行执行的数量需求,又不会占用过多的处理 器的空间,充分提高线程的使用效率。
[0038] 3、所述的基于线程池的任务分配方法中,接收任务后,任务直接在线程池调取空 闲线程,若线程池中没有空闲线程时,该任务才存储至任务池的列队中
等待,这样快速、直 接地进行任务分配,提高任务执行的效率。
[0039] 4、所述的基于线程池的任务分配方法中,在任务调取线程池中的空闲线程或线程 完成任务后,在任务池中领取任务,都顺序锁定线程池和任务池,以避免出现死锁现象。
【附图说明】
[0040] 图1为本发明所述的基于线程池的任务分配方法的流程图;
[0041] 图2为本发明其中一个实施例中所述的基于线程池的任务分配方法的创建任务 池和线程池的过程图;
[0042] 图3为本发明其中一个实施例中所述的基于线程池的任务分配方法的线程池初 始化的过程图
[0043] 图4为本发明其中一个实施例中所述的基于线程池的任务分配方法的任务分配 的过程图;
[0044] 图5为本发明其中一个实施例中所述的基于线程池的任务分配方法的线程执行 完任务后领取任务的过程图。
【具体实施方式】
[0045] 下面结合附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文 字能够据以实施。
[0046] 本发明公开了一种基于线程池的任务分配方法,如图1所示,该方法至少包括:
[0047] 步骤一,创建线程池和任务池;这两个池在软件关闭前下不会自动释放,以避免线 程创建和切换带来的资源浪费,线程池中的线程全部处在等待状态。创建线程池和任务池 的具体实例如图2所示。
[0048] 步骤二,根据处理器芯片的核数i确定所述数值n;初始化n个线程并将所述线程 顺序存储至所述线程池列队中;
[0049] 所述数量值n的计算公式为:n=i*2+2 ; (1)
[0050] 其中,i表示处理器(CPU)芯片的核数;n表示初始化线程的个数。
[0051] 初始化n个线程的具体实例如图3所示。
[0052] 步骤三,接收任务后,顺序锁定所述线程池和所述任务池,先锁定所述线程池;在 锁定所述任务池;遍历所述线程池,若所述线程池中有空闲线程时,则从所述线程池中顺序 调取所述空闲线程并执行所述任务,并对所述线程池和所述任务池进行解锁;若所述线程 池中无空闲线程时,则将所述任务顺次存储至所述任务池的列队中,并将所述线程池和所 述任务池解锁。具体实例如图4所示。
[0053] 所述基于线程池的任务分配方法中,还包括,当所述线程执行完任务后,还包括:
[0054] 所述线程进入所述任务池时,同时,先锁定所述线程池;再锁定所述任务池;
[0055] 遍历所述任务池;
[0056] 若所述任务池队列中有任务时,则从所述任务池队列中顺序调取所述任务并将该 任务分配至所述线程,并对所述线程池和所述任务池执行解锁的操作;若所述任务池中没 有任务时,对所述线程池和所述任务池执行解锁的操作,并将所述线程返回至所述线程池 队列中。线程执行完任务后,其具体实例如图5所示。
[0057] 此外,如以实例Poolpool=newPool()为例,其具体过程如下:
[0058]
[0059] 所述的基于线程池的任务分配方法中,所述任务池每次只能容纳一个所述线程。
[0060] 所述的基于线程池的任务分配方法中,当所述线程池中只有一个线程时;
[0061] 接收任务后,直接从所述线程池中调取所述线程执行该任务。
[0062] 尽管本发明的实施例已公开如上,但其并不仅仅限于说明书和实施方式中所列运 用,它完全可以被适用于各种适合本发明的领域,对于熟悉本领域的人员而言,可容易地实 现另外的修改,因此在不背离权利要求及等同范围所限定的一般概念下,本发明并不限于 特定的细节。
【主权项】
1. 一种基于线程池的任务分配方法,其特征在于,包括: 步骤一,创建线程池和任务池; 步骤二,预先确定一数量值n,初始化n个线程并将所述线程顺序存储至所述线程池列 队中; 步骤三,接收任务后遍历所述线程池,若所述线程池中有空闲线程时,则从所述线程池 中顺序调取所述空闲线程并执行所述任务;若所述线程池中无空闲线程时,则将所述任务 顺次存储至所述任务池的列队中。2. 如权利要求1所述的基于线程池的任务分配方法,其特征在于,根据处理器芯片的 核数i确定所述数值n; 所述数量值n的计算公式为:n=i*2+2 ; 其中,i表示处理器(CPU)芯片的核数;n表示初始化线程的个数。3. 如权利要求2所述的基于线程池的任务分配方法,其特征在于,步骤三中接收任务 后,还包括顺序锁定所述线程池和所述任务池。4. 如权利要求3所述的基于线程池的任务分配方法,其特征在于,所述顺序锁定所述 线程池和所述任务池具体指: 锁定所述线程池; 锁定所述任务池; 存在空闲线程时,当所述任务分配至所述空闲线程,将所述线程池和所述任务池解锁; 不存在空闲线程时,则将所述线程池和所述任务池解锁。5. 如权利要求4所述的基于线程池的任务分配方法,其特征在于,所述线程执行完任 务后,还包括: 遍历所述任务池; 若所述任务池队列中有任务时,则从所述任务池队列中顺序调取所述任务并将该任务 分配至所述线程;所述线程执行该任务; 若所述任务池中没有任务时,则所述线程返回至所述线程池队列中。6. 如权利要求5所述的基于线程池的任务分配方法,其特征在于,所述任务池每次只 能容纳一个所述线程。7. 如权利要求6所述的基于线程池的任务分配方法,其特征在于,所述线程进入所述 任务池时,包括: 锁定所述线程池; 锁定所述任务池; 所述任务池中存在任务时,当所述任务分配至所述线程后,解锁所述线程池和所述任 务池; 所述任务池中不存在任务时,解锁所述线程池和所述任务池。8. 如权利要求7所述的基于线程池的任务分配方法,其特征在于,当所述线程池中只 有一个线程时; 接收任务后,直接从所述线程池中调取所述线程执行该任务。
【专利摘要】本发明提供一种基于线程池的任务分配方法,其包括:步骤一,创建线程池和任务池;步骤二,预先确定一数量值n,初始化n个线程并将所述线程顺序存储至所述线程池列队中;步骤三,接收任务后遍历所述线程池,若所述线程池中有空闲线程时,则从所述线程池中顺序调取所述空闲线程并执行所述任务;若所述线程池中无空闲线程时,则将所述任务顺次存储至所述任务池的列队中。本发明提供一种能够充分利用现有硬件资源,实现软件多任务并行执行,且对每个任务执行者可重复使用的多线程任务分配方法,解决软件运行的性能、易用性等问题,并且避免了线程的创建调用和切换所带来的资源浪费问题。
【IPC分类】G06F9/50
【公开号】CN104899099
【申请号】CN201510274987
【发明人】李军锋
【申请人】北京金和网络股份有限公司
【公开日】2015年9月9日
【申请日】2015年5月26日