统一线程池处理方法、应用服务器及计算机可读存储介质与流程

文档序号:15076534发布日期:2018-08-01 01:51阅读:99来源:国知局
本发明涉及数据分析
技术领域
,尤其涉及一种统一线程池处理方法、应用服务器及计算机可读存储介质。
背景技术
:当前,在互联网技术中线程池得到了广泛的应用,通过引入线程池可以有效的管理线程、控制线程上限总数、以及减少创建和销毁线程所带来的开销。在实际应用中,随着业务的发展,系统中多处业务也会使用到线程池,例如敏感日志批量入库错误,重新入表、mqcp日志接收队列及公共清理等业务。线程池作用就是限制系统中执行线程的数量。根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。当一个系统对其他越来越多的系统调用增加,线程池技术面临着新的挑战:如果不对线程池进行统一管理,很容易出现高并发状况下线程紊乱或资源消耗的问题,严重影响系统稳定。技术实现要素:有鉴于此,本发明提出一种统一线程池处理方法、应用服务器及计算机可读存储介质,以解决在高并发状况下线程紊乱或资源消耗严重影响系统稳定的问题。首先,为实现上述目的,本发明提出一种统一线程池处理方法,该方法包括步骤:查询持久化数据表;根据所述持久化数据表,获取执行队列中每一个线程池的参数,所述每一个线程池的参数包括每一个线程池名称;根据所述每一个线程池的参数分别创建每一个线程池对象;根据所述每一个线程池名称与所述每一个线程池对象创建线程池队列;及通过所述线程池队列管理所述每一个线程池。可选地,所述每一个线程池的参数还包括核心线程数,最大线程数,最大队列长度,队列类型。可选地,所述根据所述每一个线程池名称与所述每一个线程池对象创建线程池队列的步骤具体包括:获取所述每一个线程池名称与所述每一个线程池对象的映射关系;以map类保存所述每一个线程池名称与所述每一个线程池对象的映射关系并创建所述线程池队列。可选地,所述根据所述每一个线程池的参数分别创建每一个线程池对象的步骤具体包括:收集所述每一个线程池的参数;通过java.uitl.concurrent.threadpoolexecutor类创建线程池。可选地,所述通过所述线程池队列管理所述每一个线程池的步骤具体包括:获取欲操作的线程池的第一线程池名称;根据所述第一线程池名称从所述线程池队列中获取对应的第一线程池对象;对所述第一线程池对象进行管理操作,所述管理操作可以包括:获取所述第一线程池对象线程数、提交任务至所述第一线程池对象及关闭所述第一线程池对象。此外,为实现上述目的,本发明还提供一种应用服务器,包括存储器、处理器,所述存储器上存储有可在所述处理器上运行的统一线程池处理系统,所述统一线程池处理系统被所述处理器执行时实现如上述的统一线程池处理方法的步骤。进一步地,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有统一线程池处理系统,所述统一线程池处理系统可被至少一个处理器执行,以使所述至少一个处理器执行如上述的统一线程池处理方法的步骤。相较于现有技术,本发明所提出的统一线程池处理方法、应用服务器及计算机可读存储介质,可以通过查询持久化数据表获取每一个线程池的参数,并根据所述每一个线程池的参数分别创建每一个线程池对象,实现了对线程池的统一创建;通过创建线程池队列保存每一个线程池名称与每一个所述线程池对象的映射关系,并根据所述线程池队列实现了对每一个所述线程池对象的统一管理,降低了系统资源消耗,提僧了系统的稳定性。附图说明图1是本发明应用服务器一可选的硬件架构的示意图;图2是本发明统一线程池处理系统第一实施例的程序模块示意图;图3是本发明统一线程池处理系统第二实施例的程序模块示意图;图4是本发明统一线程池处理方法第一实施例的流程示意图;图5是本发明统一线程池处理方法第二实施例的流程示意图;图6是本发明统一线程池处理方法第三实施例的流程示意图。附图标记:应用服务器2存储器11处理器12网络接口13统一线程池处理系统200查询模块201获取模块202线程池对象创建模块203线程池队列创建模块204管理模块205本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。需要说明的是,在本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。参阅图1所示,是本发明应用服务器2一可选的硬件架构的示意图。本实施例中,所述应用服务器2可包括,但不仅限于,可通过系统总线相互通信连接存储器11、处理器12、网络接口13。需要指出的是,图1仅示出了具有组件11-13的应用服务器2,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。其中,所述应用服务器2可以是机架式服务器、刀片式服务器、塔式服务器或机柜式服务器等计算设备,该应用服务器2可以是独立的服务器,也可以是多个服务器所组成的服务器集群。所述存储器11至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等)、随机访问存储器(ram)、静态随机访问存储器(sram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、可编程只读存储器(prom)、磁性存储器、磁盘、光盘等。在一些实施例中,所述存储器11可以是所述应用服务器2的内部存储单元,例如该应用服务器2的硬盘或内存。在另一些实施例中,所述存储器11也可以是所述应用服务器2的外部存储设备,例如该应用服务器2上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。当然,所述存储器11还可以既包括所述应用服务器2的内部存储单元也包括其外部存储设备。本实施例中,所述存储器11通常用于存储安装于所述应用服务器2的操作系统和各类应用软件,例如统一线程池处理系统200的程序代码等。此外,所述存储器11还可以用于暂时地存储已经输出或者将要输出的各类数据。所述处理器12在一些实施例中可以是中央处理器(centralprocessingunit,cpu)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器12通常用于控制所述应用服务器2的总体操作。本实施例中,所述处理器12用于运行所述存储器11中存储的程序代码或者处理数据,例如运行所述的统一线程池处理系统200等。所述网络接口13可包括无线网络接口或有线网络接口,该网络接口13通常用于在所述应用服务器2与其他电子设备之间建立通信连接。至此,己经详细介绍了本发明相关设备的硬件结构和功能。下面,将基于上述介绍提出本发明的各个实施例。首先,本发明提出一种统一线程池处理系统200。参阅图2所示,是本发明统一线程池处理系统200第一实施例的程序模块图。本实施例中,所述统一线程池处理系统200包括一系列的存储于存储器11上的计算机程序指令,当该计算机程序指令被处理器12执行时,可以实现本发明各实施例的统一线程池处理操作。在一些实施例中,基于该计算机程序指令各部分所实现的特定的操作,统一线程池处理系统200可以被划分为一个或多个模块。例如,在图2中,所述统一线程池处理系统200可以被分割成查询模块201、获取模块202、线程池对象创建模块203及线程池队列创建模块204。其中:所述查询模块201,用于查询持久化数据表。具体地,需要从key-value数据库中读取所述持久化数据表,在一实施例中,所述key-value数据库可以为redis数据库。所述持久化数据表用于存储执行队列中每一个线程池对象的参数信息,所述参数信息包括线程池名称、核心线程数、最大线程数、最大队列长度、队列类型。在本实施例中,所述持久化方法为根据一定的保存规则定期对redis在内存中的数据做一个快照,把快照数据同步到硬盘上,每次的快照文件就是一个保存着redis数据的二进制文件。所述获取模块202,用于根据所述持久化数据表,获取执行队列中每一个线程池的参数。具体地,所述每一个线程池的参数包括线程池名称、核心线程数、最大线程数、最大队列长度、队列类型。其中所述核心线程数(corepoolsize)中的核心线程会一直存活,即使没有任务需要执行。当正在运行的线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。在一实施例中,当需要添加一个任务至第一线程池时,若第一线程池中正在运行的线程数量小于核心线程数,那么第一线程池马上创建线程运行这个任务;若第一线程池中正在运行的线程数量大于或等于核心线程数,那么将这个任务放入第一线程池的任务队列中。所述最大线程数(maximumpoolsize)用于表示在线程池中最多能创建多少个线程。在一实施例中,当需要添加一个任务至第一线程池时,若第一线程池的任务队列已满(即已达到最大队列长度),而且正在运行的线程数量小于最大线程数,那么还是要创建新的线程运行这个任务;在进一步的实施例中,当需要添加一个任务至第一线程池时,如果队列已满(即已达到最大队列长度),而且正在运行的线程数量大于或等于最大线程数,第一线程池将抛出异常。所述队列类型包括:直接提交队列,无界队列及有界队列。其中,所述直接提交队列可以为synchronousqueue。在一实施例中,可以设置synchronousqueue为工作队列的默认选项,所述直接提交队列直接提交给线程而不需要排队。若不存在可用于立即运行任务的线程,所述直接提交队列把任务加入队列失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。所述直接提交队列通常要求无界最大线程数以避免拒绝新提交的任务。当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。所述有界队列可以为arrayblockingqueue。其中arrayblockingqueue为基于数组结构的有界阻塞队列,此队列按fifo(先进先出)原则对元素进行排序。所述无界队列可以为linkedblockingqueue。linkedblockingqueue为基于链表结构的阻塞队列,此队列按fifo(先进先出)排序元素,吞吐量通常要高于arrayblockingqueue。所述线程池对象创建模块203,用于根据所述每一个线程池的参数分别创建每一个线程池对象。具体地,通过java.uitl.concurrent.threadpoolexecutor类创建线程池,具体创建方法为:其中,keepalivetime表示线程没有任务执行时最多保持多久时间会终止。unit为参数keepalivetime的时间单位;其中,threadfactory为线程工厂,用于创建线程;其中,handler为当拒绝处理任务时的策略。在一实施例中,当handler取值为threadpoolexecutor.abortpolicy时,丢弃任务并抛出rejectedexecutionexception异常;在一实施例中,当handler取值为threadpoolexecutor.discardpolicy时,丢弃任务,但不需抛出rejectedexecutionexception异常;在一实施例中,当handler取值为threadpoolexecutor.discardoldestpolicy时,丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程);在一实施例中,当handler取值为threadpoolexecutor.callerrunspolicy时,由调用线程处理该任务。所述线程池队列创建模块204,用于根据所述线程池名称与所述线程池对象创建线程池队列。具体地,将所述线程池名称与对应的所述线程池对象的映射关系保存下来,作为所述线程池队列。在一实施例中,所述线程池名称与对应的所述线程池对象的映射关系可以表示为map<threadpoolname,threadpool>,其中map类的key为所述线程池名称,value为所述线程池对象。在进一步的实施例中,可以通过map.put(threadpoolname2,threadpool2)向所述线程池队列添加第二线程池名称与对应的第二线程池对象的映射关系。参阅图3所示,是本发明统一线程池处理系统200第二实施例的程序模块图。本实施例中,所述的统一线程池处理系统200除了包括第一实施例中的查询模块201、获取模块202、线程池对象创建模块203、线程池队列创建模块204之外,还包括管理模块205。所述管理模块205用于通过所述线程池队列管理所述每一个线程池。具体地,可以通过objectget=map.get("threadpoolname")获取与所述线程池名称对应的线程池对象,管理所述与所述线程池名称对应的线程池对象。在一优选实施例中所述管理模块205具体用于:获取欲操作的线程池的第一线程池名称;根据所述第一线程池名称从所述线程池队列中获取对应的第一线程池对象;对所述第一线程池对象进行管理操作,所述管理操作可以包括:获取所述第一线程池对象线程数、提交任务至所述第一线程池对象及关闭所述第一线程池对象。在一实施例中,可以通过所述线程池名称获取与所述线程池名称对应的线程池对象当前活动的线程数具体的,可以通过privatevolatileintpoolsize获取与所述线程池名称对应的线程池对象当前活动的线程数。在一实施例中,可以通过所述线程池名称获取与所述线程池名称对应的线程池对象的当前执行队列的长度。在一实施例中,可以通过线程池名称,参数信息及待启动的任务对象,将所述待启动的任务对象提交给指定的线程池对象。具体的,可以通过execute()与submit()向所述指定的线程池对象提交所述待启动的任务对象。在进一步的实施例中,所述线程池对象在接收到所述待启动的任务对象后:当所线程池对象当前活动的线程数小于核心线程数,创建线程运行这个任务;当所述线程池对象当前活动的线程数大于或等于核心线程数,将这个任务放入队列;当所述线程池对象当前活动的线程数小于最大线程数,创建新的线程运行这个任务;当所述线程池对象当前活动的线程数大于或等于最大线程数,线程池会抛出异常。在一实施例中,可以通过所述线程池名称关闭与所述线程池名称对应的线程池对象。具体的,可以采用shutdown()与shutdownnow()关闭与所述线程池名称对应的线程池对象。其中shutdown()不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务;shutdownnow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务。本发明统一线程池处理系统通过查询持久化数据表获取每一个线程池的参数,并根据所述每一个线程池的参数分别创建每一个线程池对象,实现了对线程池的统一创建;通过创建线程池队列保存每一个线程池名称与每一个所述线程池对象的映射关系,并根据所述线程池队列实现了对每一个所述线程池对象的统一管理,降低了系统资源消耗,提僧了系统的稳定性。此外,本发明还提出一种统一线程池处理方法。参阅图4所示,是本发明统一线程池处理方法第一实施例的流程示意图。在本实施例中,根据不同的需求,图5所示的流程图中的步骤的执行顺序可以改变,某些步骤可以省略。步骤s402,查询持久化数据表。具体地,需要从key-value数据库中读取所述持久化数据表,在一实施例中,所述key-value数据库可以为redis数据库。所述持久化数据表用于存储执行队列中每一个线程池对象的参数信息,所述参数信息包括线程池名称、核心线程数、最大线程数、最大队列长度、队列类型。在本实施例中,所述持久化方法为根据一定的保存规则定期对redis在内存中的数据做一个快照,把快照数据同步到硬盘上,每次的快照文件就是一个保存着redis数据的二进制文件。步骤s404,根据所述持久化数据表,获取执行队列中每一个线程池的参数,所述每一个线程池的参数包括每一个线程池名称。具体地,所述每一个线程池的参数包括线程池名称、核心线程数、最大线程数、最大队列长度、队列类型。其中所述核心线程数(corepoolsize)中的核心线程会一直存活,即使没有任务需要执行。当正在运行的线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。在一实施例中,当需要添加一个任务至第一线程池时,若第一线程池中正在运行的线程数量小于核心线程数,那么第一线程池马上创建线程运行这个任务;若第一线程池中正在运行的线程数量大于或等于核心线程数,那么将这个任务放入第一线程池的任务队列中。其中所述核心线程数(corepoolsize)中的核心线程会一直存活,及时没有任务需要执行当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。所述最大线程数(maximumpoolsize)用于表示在线程池中最多能创建多少个线程:在一实施例中,当需要添加一个任务至第一线程池时,若第一线程池的任务队列已满(即已达到最大队列长度),而且正在运行的线程数量小于最大线程数,那么还是要创建新的线程运行这个任务;在进一步的实施例中,当需要添加一个任务至第一线程池时,如果队列已满(即已达到最大队列长度),而且正在运行的线程数量大于或等于最大线程数,第一线程池将抛出异常。所述队列类型包括:直接提交队列,无界队列及有界队列。其中,所述直接提交队列可以为synchronousqueue。在一实施例中,可以设置synchronousqueue为工作队列的默认选项,所述直接提交队列直接提交给线程而不需要排队。若不存在可用于立即运行任务的线程,所述直接提交队列把任务加入队列失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。所述直接提交队列通常要求无界最大线程数以避免拒绝新提交的任务。当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。所述有界队列可以为arrayblockingqueue。其中arrayblockingqueue为基于数组结构的有界阻塞队列,此队列按fifo(先进先出)原则对元素进行排序。所述无界队列可以为linkedblockingqueue。linkedblockingqueue为基于链表结构的阻塞队列,此队列按fifo(先进先出)排序元素,吞吐量通常要高于arrayblockingqueue。步骤s406,根据所述每一个线程池的参数分别创建每一个线程池对象具体地,通过java.uitl.concurrent.threadpoolexecutor类创建线程池,具体创建方法为:其中,corepoolsize表示核心池大小。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartallcorethreads()或者prestartcorethread()方法。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到核心线程数后,就会把到达的任务放到缓存队列当中;其中,maximumpoolsize表示线程池最大线程数,表示在线程池中最多能创建多少个线程;其中,keepalivetime表示线程没有任务执行时最多保持多久时间会终止;其中unit为参数keepalivetime的时间单位;其中,threadfactory为线程工厂,用于创建线程;其中,handler为当拒绝处理任务时的策略。在一实施例中,当handler取值为threadpoolexecutor.abortpolicy时,丢弃任务并抛出rejectedexecutionexception异常;在一实施例中,当handler取值为threadpoolexecutor.discardpolicy时,丢弃任务,但不需抛出rejectedexecutionexception异常;在一实施例中,当handler取值为threadpoolexecutor.discardoldestpolicy时,丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程);在一实施例中,当handler取值为threadpoolexecutor.callerrunspolicy时,由调用线程处理该任务。步骤s408,根据所述每一个线程池名称与所述每一个线程池对象创建线程池队列。具体地,将所述线程池名称与对应的所述线程池对象的映射关系保存下来,作为所述线程池队列。在一实施例中,所述线程池名称与对应的所述线程池对象的映射关系可以表示为map<threadpoolname,threadpool>,其中map类的key为所述线程池名称,value为所述线程池对象。在进一步的实施例中,可以通过map.put(threadpoolname2,threadpool2)向所述线程池队列添加第二线程池名称与对应的第二线程池对象的映射关系。如图5所示,是本发明统一线程池处理方法的第二实施例的流程示意图。本实施例中,所述统一线程池处理方法的步骤s502-s508与第一实施例的步骤s402-s408相类似,区别在于该方法还包括步骤s510。该方法包括以下步骤:步骤s510,通过所述线程池队列管理所述每一个线程池。具体地,可以通过objectget=map.get("threadpoolname")获取与所述线程池名称对应的线程池对象,管理所述与所述线程池名称对应的线程池对象。具体步骤将在本发明统一线程池处理方法的第三实施例(参阅图6)进行详述。如图6所示,是本发明统一线程池处理方法的第三实施例的流程示意图。本实施例中,所述通过所述线程池队列管理所述每一个线程池的步骤,具体包括:步骤602,获取欲操作的线程池的第一线程池名称。具体的,在接收操作指令之后,根据所述操作指令提取所述欲操作的线程池的第一线程池名称。步骤604,根据所述第一线程池名称从所述线程池队列中获取对应的第一线程池对象。具体的,将获取的所述第一线程池名称作为变量threadpoolname,并传递至所述线程池队列中。在一实施例中,通过objectget=map.get("threadpoolname")获取与所述线程池名称对应的线程池对象。步骤606,对所述第一线程池对象进行管理操作。具体的,所述管理操作可以包括:获取所述第一线程池对象线程数、提交任务至所述第一线程池对象及关闭所述第一线程池对象。在一实施例中,可以通过所述线程池名称获取与所述线程池名称对应的线程池对象当前活动的线程数具体的,可以通过privatevolatileintpoolsize获取与所述线程池名称对应的线程池对象当前活动的线程数。在一实施例中,可以通过所述线程池名称获取与所述线程池名称对应的线程池对象的当前执行队列的长度。在一实施例中,可以通过线程池名称,参数信息及待启动的任务对象,将所述待启动的任务对象提交给指定的线程池对象。具体的,可以通过execute()与submit()向所述指定的线程池对象提交所述待启动的任务对象。在进一步的实施例中,所述线程池对象在接收到所述待启动的任务对象后:当所线程池对象当前活动的线程数小于核心线程数,创建线程运行这个任务;当所述线程池对象当前活动的线程数大于或等于核心线程数,将这个任务放入队列;当所述线程池对象当前活动的线程数小于最大线程数,创建新的线程运行这个任务;当所述线程池对象当前活动的线程数大于或等于最大线程数,线程池会抛出异常。在一实施例中,可以通过所述线程池名称关闭与所述线程池名称对应的线程池对象。具体的,可以采用shutdown()与shutdownnow()关闭与所述线程池名称对应的线程池对象。其中shutdown()不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务;shutdownnow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务。本发明统一线程池处理方法通过查询持久化数据表获取每一个线程池的参数,并根据所述每一个线程池的参数分别创建每一个线程池对象,实现了对线程池的统一创建;通过创建线程池队列保存每一个线程池名称与每一个所述线程池对象的映射关系,并根据所述线程池队列实现了对每一个所述线程池对象的统一管理,降低了系统资源消耗,提僧了系统的稳定性。上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的
技术领域
,均同理包括在本发明的专利保护范围内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1