一种基于响应式编程单机单JVM实例的线程池制造技术

技术编号:34103041 阅读:18 留言:0更新日期:2022-07-11 23:52
本发明专利技术提供一种基于响应式编程单机单JVM实例的线程池,涉及计算机技术领域,包括:线程池对象和多个线程对象;线程池对象中存放有任务队列,且线程池对象内设有任务发布器和分配器;线程对象中维护一个需要执行的工作队列,且设有多种实现方法;分配器根据分配策略将任务队列中的任务推送给各线程对象,线程对象中sub方法将任务推送至工作队列,线程对象中work方法从工作队列的头部获取需要执行的当前任务,根据当前任务的名称从任务发布器中获取对应的数据内容,并完成当前任务的执行后触发resub方法,获取工作队列中的下一任务。本发明专利技术采用响应式编程的思想设计线程池对象,充分利用计算机资源,促进应用软件的快速、稳定访问。问。问。

【技术实现步骤摘要】
一种基于响应式编程单机单JVM实例的线程池


[0001]本专利技术涉及计算机
,尤其是涉及一种基于响应式编程单机单JVM实例的线程池。

技术介绍

[0002]在计算机编程领域中,响应式编程或反应式编程(英语:Reactive programming)是一种面向数据流和变化传播的声明式编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。相对于面向对象和面向过程的编程范式,响应式编程采用的异步化的对流数据进行处理,使用响应式编程方式可以有效的提高在数据体量较大,单个数据较小场景下的资源的高效利用。
[0003]现代线程对象的创建和销毁在一定程度上会消耗系统的资源,虽然jvm的性能在近几年已经得到了很大的提高,对于多数对象来说,没有必要利用对象池技术来进行对象的创建和管理。但是对于有些对象来说,其创建的代价还是比较昂贵的,比如线程、tcp连接、rpc连接、数据库连接等对象,因此对象池技术还是有其存在的意义。
[0004]现有线程池的实现核心思想是根据当前的操作系统可用CPU核心数量乘以固定的系数,或按照固定的数值作为基础的线程池中可用的基础线程创建数量。开发者在编程的时候,封装需要执行的操作任务,提交到线程池中进行运行,运行完成后该线程对象重新返回线程池,等待下一次唤醒调用。
[0005]现有的多线程编程下的线程池技术在内部队列对象的复用上采用大量的同步锁(读写锁)设置,如图2所示,即同时有且仅有一个线程可以获取队列的读取和操作权限,在单个任务执行时间较长,且较多任务堆积的情况下,线程池中的线程无法充分的进行任务执行,大量的时间用于争夺线程池任务队列的锁。或者进行IO等待,没有发挥出主频越来越高的单核心能力。且当前的线程池中的队列采用的是闲置线程拉的模式,在主动拉的模式中需要线程在固定时间间隔下进行轮巡任务队列的操作。如果一个线程对象始终无法获取队列操作的锁,将会一直间歇性的沉睡。
[0006]现代的应用软件开发当中,接受用户请求的服务器大多都是24小时不停歇的,数据呈现动态水流性特征,并且根据时间的推移大部分用户的请求数量呈现周期性变化。这种情况下使用标准的线程池的编程方式处理用户请求,若在某个时刻用户访问量超过了线程池的数量,会因为产生锁等待或线程因间歇性的沉睡无法及时的响应而产生线程池中的队列的任务堆积,表现为CPU居高不下,内存占用也节节攀升,使网络侧大量TCP连接超时,不能充分利用计算机资源,且严重影响用户访问反馈。

技术实现思路

[0007]针对上述问题,本专利技术提供了一种基于响应式编程单机单JVM实例的线程池,采用响应式编程的思想设计线程池对象,更加充分的利用计算机资源适应快速发展的计算机硬
件条件,促进应用软件的快速、稳定访问。
[0008]为实现上述目的,本专利技术提供了一种基于响应式编程单机单JVM实例的线程池,包括:线程池对象和多个线程对象;
[0009]所述线程池对象中存放有任务队列,且所述线程池对象内设有任务发布器和分配器;
[0010]所述线程对象中维护一个需要执行的工作队列,且作为任务执行器设有多种实现方法;
[0011]所述分配器根据预设分配策略将所述任务队列中的任务推送给各所述线程对象,所述线程对象中sub方法将所述任务推送至所述工作队列,所述线程对象中work方法从所述工作队列的头部获取需要执行的当前任务,根据所述当前任务的名称从所述任务发布器中获取对应的数据内容,并完成当前任务的执行后触发resub方法,获取所述工作队列中的下一任务。
[0012]作为本专利技术的进一步改进,所述任务发布器设有标准方法接口及多种实现方法,包括before方法、pub方法、reload方法和onNext方法;
[0013]所述pub方法为任务注册方法,规定了任务执行细节以及对应需要的数据及数据应用地址信息;
[0014]所述before方法为执行任务之前需要执行的方法;
[0015]所述reload方法为进行任务重排的处理方法;
[0016]所述onNext方法为任务执行成功、失败或异常后均需执行的方法。
[0017]作为本专利技术的进一步改进,所述work方法,根据所述当前任务的名称从所述任务发布器中获取对应的数据内容,包括:
[0018]顺序调用所述任务发布器中的before方法、pub方法和onNext方法。
[0019]作为本专利技术的进一步改进,所述任务队列采用无解队列,所述工作队列采用读写锁的无解队列。
[0020]作为本专利技术的进一步改进,所述sub方法不对用户开放接口调用,由所述分配器唤醒所述线程对象向该所述线程对象推送任务时调用。
[0021]作为本专利技术的进一步改进,所述work方法不对用户开放接口调用,所述分配器向所述线程对象推送任务时,由sub方法被调用时触发。
[0022]作为本专利技术的进一步改进,所述resub方法,当执行结果为true时,对应的所述线程对象继续执行任务,当执行结果为flase时,将对应的所述线程对象沉睡。
[0023]作为本专利技术的进一步改进,所述分配器的预设分配策略包括顺序分配、随机分配和先进先出分配。
[0024]作为本专利技术的进一步改进,
[0025]所述顺序分配是根据任务到达的时间将任务按照顺序推送到当前线程池对象中1

N个线程对象中;
[0026]所述随机分配是根据任务到达的时间将任务随机的分配到1

N个线程对象中;
[0027]所述先进先出是将任务分配到所述工作队列最短的所述线程对象中。
[0028]作为本专利技术的进一步改进,所述分配器设有工作重排模式,在固定时间片内轮巡所有所述线程对象的所述工作队列长度,计算各所述工作队列的深度均值,将工作负载较
高的所述线程对象的工作队列进行截取,重新推送到所述分配器头部,由分配器重新分配至各所述线程对象。
[0029]与现有技术相比,本专利技术的有益效果为:
[0030]本专利技术通过设置分配器规避了任务队列在分配过程中的各种锁等待,以及线程对象自旋轮询的操作,使任务队列中大量任务堆积的情况下线程对象的调度更加积极;同时,在任务发布器中整合了任务执行所需的信息,减少了线程对象执行任务过程中的内容拷贝和锁等待的现象,加速了任务执行的效率和速度,实现计算机资源的充分利用。
[0031]本申请为分配器增加了重排模式,通过计算工作队列的深度,针对各线程对象中工作队列执行耗时不一致的情况,具有一定的适应能力。
附图说明
[0032]图1为本专利技术一种实施例公开的基于响应式编程单机单JVM实例的线程池示意图;
[0033]图2为本专利技术一种实施例公开的现有的多线程编程下的设置为读写锁的线程池示意图。
具体实施方式
[0034]为使本专利技术实施例的目的、技术方案和优点更加清楚,下面将结合本专利技术实施例中本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于响应式编程单机单JVM实例的线程池,包括:线程池对象和多个线程对象;所述线程池对象中存放有任务队列,且所述线程池对象内设有任务发布器和分配器;所述线程对象中维护一个需要执行的工作队列,且作为任务执行器设有多种实现方法;所述分配器根据预设分配策略将所述任务队列中的任务推送给各所述线程对象,所述线程对象中sub方法将所述任务推送至所述工作队列,所述线程对象中work方法从所述工作队列的头部获取需要执行的当前任务,根据所述当前任务的名称从所述任务发布器中获取对应的数据内容,并完成当前任务的执行后触发resub方法,获取所述工作队列中的下一任务。2.根据权利要求1所述的线程池,其特征在于:所述任务发布器设有标准方法接口及多种实现方法,包括before方法、pub方法、reload方法和onNext方法;所述pub方法为任务注册方法,规定了任务执行细节以及对应需要的数据及数据应用地址信息;所述before方法为执行任务之前需要执行的方法;所述reload方法为进行任务重排的处理方法;所述onNext方法为任务执行成功、失败或异常后均需执行的方法。3.根据权利要求1所述的线程池,其特征在于:所述work方法,根据所述当前任务的名称从所述任务发布器中获取对应的数据内容,包括:顺序调用所述任务发布器中的before方法、pub方法和onNext方法。4.根据权利要求1所述的线程池,其特征在于:所述任...

【专利技术属性】
技术研发人员:陈成陈廷梁
申请(专利权)人:浙江数新网络有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1