Java线程池的任务处理方法、装置、设备和介质转让专利
申请号 : CN202110455550.2
文献号 : CN113220429B
文献日 : 2022-05-20
发明人 : 朱文魁
申请人 : 武汉联影医疗科技有限公司
摘要 :
权利要求 :
1.一种Java线程池的任务处理方法,其特征在于,所述方法包括:在接收到目标任务的情况下,判断线程池是否满负荷;所述目标任务为预设的任务集中的任务;
若所述线程池满负荷,根据所述线程池对应的缓冲队列数的目标值、所述线程池对应的目标线程数和所述任务集对应的最小任务耗时,确定出第一目标时间,根据所述第一目标时间和所述最小任务耗时,确定执行所述目标任务所需的等待时间;其中,所述最小任务耗时为所述任务集对应的各任务的任务耗时中的最小值;所述第一目标时间为执行完所述线程池对应的缓冲队列所需的时间;
在所述等待时间到达时,控制主线程添加所述目标任务到线程池中。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:若所述线程池未满负荷,则控制所述主线程将所述目标任务添加到所述线程池中。
3.根据权利要求2所述的方法,其特征在于,所述目标任务所需的等待时间与第二目标时间线性相关;其中,所述第二目标时间为所述第一目标时间与所述最小任务耗时之和。
4.根据权利要求2所述的方法,其特征在于,所述第一目标时间与所述线程池对应的缓冲队列数的目标值、所述线程池对应的目标线程数、所述最小任务耗时均线性相关。
5.根据权利要求1所述的方法,其特征在于,所述判断线程池是否满负荷,包括:若所述线程池中当前执行任务的线程数达到所述目标线程数,且所述线程池的缓冲队列数达到所述目标值,则确定所述线程池满负荷。
6.根据权利要求1所述的方法,其特征在于,所述线程池对应的缓冲队列数的目标值为根据所述线程池对应的预设缓冲队列数与预设阈值所确定的。
7.根据权利要求6所述的方法,其特征在于,所述预设阈值与所述线程池对应的预设缓冲队列数线性相关。
8.一种Java线程池的任务处理装置,其特征在于,所述装置包括:判断模块,用于在接收到目标任务的情况下,判断线程池是否满负荷;所述目标任务为预设的任务集中的任务;
确定模块,用于若所述线程池满负荷,根据所述线程池对应的缓冲队列数的目标值、所述线程池对应的目标线程数和所述任务集对应的最小任务耗时,确定出第一目标时间,根据所述第一目标时间和所述最小任务耗时,确定执行所述目标任务所需的等待时间;其中,所述最小任务耗时为所述任务集对应的各任务的任务耗时中的最小值;所述第一目标时间为执行完所述线程池对应的缓冲队列所需的时间;
控制模块,用于在所述等待时间到达时,控制主线程添加所述目标任务到线程池中。
9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述的方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
说明书 :
Java线程池的任务处理方法、装置、设备和介质
技术领域
背景技术
再新创建线程。通常,当新的任务添加至线程池时,若线程池中无空闲工作线程且缓冲队列
已满的情况下,将判断线程池中的线程数是否达到最大线程数,如果没有达到最大线程数,
则新启动线程来执行任务,如果已经达到最大线程数,则通过相应的拒绝策略来处理这些
任务。
任务来的时候,即使其他线程已经空闲了,但是由于主线程正在执行任务,处于忙碌状态,
无法分配新任务到当前线程池。
发明内容
时间;其中,所述最小任务耗时为所述任务集对应的各任务的任务耗时中的最小值;
等待时间,包括:
冲队列所需的时间;
任务所需的等待时间;其中,所述最小任务耗时为根据所述任务集对应的各任务的任务耗
时所确定的;
时间;其中,所述最小任务耗时为所述任务集对应的各任务的任务耗时中的最小值;
时间;其中,所述最小任务耗时为所述任务集对应的各任务的任务耗时中的最小值;
根据线程池对应的缓冲队列数的目标值、线程池对应的目标线程数和上述任务集对应的最
小任务耗时,确定执行该目标任务所需的等待时间,在该等待时间到达时,控制主线程添加
目标任务到线程池中,通过控制主线程将目标任务添加到线程池中避免了因主线程执行任
务阻塞时间过长,线程池线程处于空闲状态而造成的资源浪费;另外,通过确定执行目标任
务所需的等待时间,既能保证主线程只负责分配任务而不是去执行任务,又能充分利用线
程池资源保证线程池吞吐量。
附图说明
具体实施方式
用于限定本申请。
需再新创建线程。通常,一个新任务添加至线程池时,若线程池中有空闲的工作线程,则由
该工作线程来运行该任务;在无空闲的工作线程的情况下,任务将被保存至缓冲队列,等待
工作线程当前任务运行完毕;在无空闲工作线程且缓冲队列已满的情况下,判断线程池中
的线程数是否达到最大线程数,如果没有达到最大线程数则新启动线程来执行任务,如果
已经达到最大线程数则通过相应的拒绝策略来处理这些任务,目前常见的拒绝策略中的调
用者运行策略当线程池达到最大线程数且缓冲队列已满的情况下,则由主线程来执行任
务,这样再有新任务来的时候即使其他线程已经空闲了,但是由于主线程正在执行任务处
于忙碌状态,无法分配新任务到当前线程池,导致资源的浪费影响任务处理的吞吐量。为
此,本申请针对拒绝策略中的调用者运行策略存在资源浪费的问题,提出了一种Java线程
池的任务处理方法、装置、计算机设备和存储介质。
程序,处理器执行该计算机程序时可以执行下述方法实施例的步骤。可选的,该计算机设备
还可以包括网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控
制能力。该计算机设备的存储器包括非易失性存储介质、内存储器,该非易失性存储介质存
储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序
的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。可选的,
该计算机设备可以是服务器,可以是个人计算机,还可以是个人数字助理,还可以是其他的
终端设备,例如平板电脑、手机等等,还可以是云端或者远程服务器,本申请实施例对计算
机设备的具体形式并不做限定。
下,计算机设备判断Java线程池是否满负荷,根据Java线程池是否满负荷为目标任务分配
线程,从而执行该目标任务。示例性地,以预设的任务集中包括30个任务为例,该目标任务
可以为该任务集中的第25个任务,也可以为该任务集中的第12个任务,本实施例在此不做
限制。需要说明的是,本实施例中的线程池满负荷是指该线程池中当前执行任务的线程数
达到了最大线程数并且该线程池的缓冲队列已满的情况。
务耗时为任务集对应的各任务的任务耗时中的最小值。
小任务耗时,确定执行该目标任务所需的等待时间,其中,上述任务集对应的最小任务耗时
为该任务集中各任务的任务耗时中的最小值,例如,该任务集中有15个任务,则计算机设备
将这15个任务中耗时最小的时间值确定为该任务集对应的最小任务耗时。可选的,本实施
例中线程池对应的缓冲队列数的目标值可以为该线程池对应的缓冲队列数的最大值,线程
池对应的目标线程数可以为该线程池对应的最大线程数。可选的,若计算机设备判断得到
该线程池未满负荷,则计算机设备可以控制主线程将该目标任务添加到线程池中。
于该线程池的线程。需要说明的是,上述等待时间是线程池消费完现有任务的最小时间,所
以在上述等待时间到达的这段时间内,线程池仍处于满负荷状态,仍在执行任务。
的缓冲队列数的目标值、线程池对应的目标线程数和上述任务集对应的最小任务耗时,确
定执行该目标任务所需的等待时间,在该等待时间到达时,控制主线程添加目标任务到线
程池中,通过控制主线程将目标任务添加到线程池中避免了因主线程执行任务阻塞时间过
长,线程池线程处于空闲状态而造成的资源浪费;另外,通过确定执行目标任务所需的等待
时间,既能保证主线程只负责分配任务而不是去执行任务,又能充分利用线程池资源保证
线程池吞吐量。
例中,如图3所示,上述S202,包括:
间。
所需的第一目标时间。可选的,上述第一目标时间与上述线程池对应的缓冲队列数的目标
值、线程池对应的目标线程数和上述任务集对应的最小任务耗时均线性相关。示例性地,计
算机设备可以根据线程池对应的缓冲队列数的目标值、线程池对应的目标线程数和上述最
小任务耗时以及公式 确定出执行完线程池对应的缓冲队列
所需的时间,式中,t表示第一目标时间,maxQueue表示线程池对应的缓冲队列数的目标值,
maxPoolsize表示线程池对应的目标线程数,minTasktime为上述最小任务耗时。可选的,计
算机设备也可以将线程池对应的缓冲队列数的目标值和预设的比例因子相乘从而确定出
第一目标时间,即可根据公式 确定出第一目标时间,
式中,factor表示预设的比例因子。
最小任务耗时之和确定为执行上述目标任务所需的等待时间。需要说明的是,将上述第一
目标时间和上述最小任务耗时之和确定为执行目标任务所需的等待时间的含义为在执行
完线程池中所有任务都是耗时最小的这种极端情况下,执行完线程池对应的缓冲队列所需
的时间和正在执行的任务所需的时间都为最小耗时,从而保证目标任务在等待的这段时间
内线程池是处于满负荷状态而不会出现空闲的情况。
所需的第一目标时间,进而可以根据确定的第一目标时间和任务集对应的最小任务耗时,
确定出执行目标任务所需的等待时间,由于确定的执行完线程池对应的缓冲队列所需的第
一目标时间是根据线程池对应的缓冲队列数的目标值、线程池对应的目标线程数和任务集
对应的最小任务耗时确定的,而目标任务所需的等待时间是根据该第一目标时间和任务集
对应的最小任务耗时确定的,保证了目标任务在等待的这段时间内线程池是处于满负荷状
态不会出现空闲的情况,避免了线程池线程处于空闲状态而造成的资源浪费。
性相关;其中,第二目标时间为第一目标时间与任务集对应的最小任务耗时之和。
其中,目标任务所需的等待时间与该第二目标时间线性相关。可选的,计算机设备可以将第
二目标时间确定为上述目标任务所需的等待时间,也可以将第二目标时间和参数相乘的乘
积确定为目标任务所需的等待时间。
时间与该第二目标时间间的线性相关的关系确定出目标任务所需的等待时间,由于确定的
目标任务所需的等待时间是与执行完线程池对应的缓冲队列所需的第一目标时间和任务
集对应的最小任务耗时之和线性相关的,保证了目标任务在等待的这段时间内线程池是处
于满负荷状态不会出现空闲的情况,避免了线程池线程处于空闲状态而造成的资源浪费。
冲队列数达到目标值,则确定线程池满负荷。
为一种实现方式,线程池满负荷是指线程池达到最大线程数并且线程池缓冲队列已满,这
里需要说明的是线程池缓冲队列已满并不代表当前缓冲队列大小workQueue.size()达到
最大值maxQueue,而是通过当前缓冲队列大小workQueue.size()是否超过缓冲队列最大
值maxQueue乘以线程池缓冲队列阀值factor来确认缓冲队列已满,即若workQueue.size
()>maxQueue*factor则表示线程池队列已满。可选的,计算机设备可以根据计算公式:
activeCount==maxPoolSize&&workQueue.size()>maxQueue*factor)判断线程池是否
满负荷,式中,activeCount表示线程池正在执行任务的线程数,maxPoolSize表示线程池最
大线程数,workQueue.size()表示当前缓冲队列大小,maxQueue表示线程池缓冲队列
workQueue的最大值,这里需要说明的是,线程池缓冲队列的阀值在多线程环境下队列变化
较快,所以判断缓冲队列是否已满不能直接通过workQueue.size()==maxQueue进行判
断,而应该对maxQueue加一个比例因子,例如,0.95等,比例因子的具体数值可以根据队列
大小进行确定。
过程十分简单,根据线程池中当前执行任务的线程数和线程池的缓冲队列数就能够进行确
定,从而提高了确定线程池是否满负荷的效率。
进行确定。可选的,线程池对应的缓冲队列数的目标值可以为该线程池对应的缓冲队列数
的最大值。可选的,上述预设阈值与该线程池对应的预设缓冲队列数线性相关,也就是说,
计算机设备可以根据线程池对应的预设缓冲队列数确定上述阈值,一般地,线程池对应的
预设缓冲队列数越大,则上述阈值越大,线程池对应的预设缓冲队列数越小,则上述阈值越
小。
度。
的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2‑3中的至少一
部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行
完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而
是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
中,最小任务耗时为根据任务集对应的各任务的任务耗时所确定的。
队列所需的时间。
部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算
机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器
调用执行以上各个模块对应的操作。
时为任务集对应的各任务的任务耗时中的最小值;
时为任务集对应的各任务的任务耗时中的最小值;
可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,
本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可
包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read‑
Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器
(Random Access Memory,RAM)或外部高速缓冲存储器。作为说明而非局限,RAM可以是多种
形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存
储器(Dynamic Random Access Memory,DRAM)等。
盾,都应当认为是本说明书记载的范围。
说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护
范围。因此,本申请专利的保护范围应以所附权利要求为准。