一种线程获取方法及设备与流程

文档序号:12119460阅读:211来源:国知局
一种线程获取方法及设备与流程

本申请涉及通信技术领域,特别涉及一种线程获取方法,以及一种线程获取设备。



背景技术:

在基于面向对象编程的应用中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。

例如,在基于Java编程技术的应用中,JVM(JAVA Virtual Machine,JAVA虚拟机)将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,于是产生了线程池技术。

线程池技术能有效减少多线程环境中资源的消耗,可以提高系统的处理能力。但是其缺陷是当通过线程池并发获得线程的时候,为保证同一个线程不会被两个待执行工作任务所同时获取,需要进行加锁,排队获取线程,由此会造成获取线程效率降低。



技术实现要素:

本申请提供一种线程获取方法及设备,在应用程序获取线程池中的线程执行操作时,尽量减少了任务与任务之间的资源争用,提高了获取执行任务的线程的效率,进而增强应用程序的伸缩性和健壮性。

本申请实施例提供一种线程获取方法,所述方法包括以下步骤:

在应用服务器启动时,将线程池划分为多个线程集合;

当确认一个或多个待执行用户任务需要从所述线程池中获取线程进行执行操作时,分别确定各待执行用户任务所归属的线程集合;

分别判断所确定的各线程集合中是否有空闲线程;

当判断当前线程集合中有空闲线程时,将所述空闲线程返回给归属到所述当前线程集合的待执行用户任务。

优选的,所述在应用服务器启动时,将线程池划分为多个线程集合之后,还包括:

为各所述线程集合设置最小线程数量和最大线程数量;

为各所述线程集合创建最小线程数量的线程;

初始化包含所述最小线程数量的线程的各所述线程集合。

优选的,所述分别判断所确定的各线程集合中是否有空闲线程之后,还包括:

当判断当前线程集合中没有空闲线程时,判断在所述当前线程集合中执行操作的用户任务数量是否大于为所述线程集合设置的最大线程数量;

如果没有大于,则在所述当前线程集合中创建一个线程,供归属到所述当前线程集合的待执行用户任务使用;

如果大于,则根据预设的线程替换规则,判断在所述线程池中的其他线程集合中是否可以为所述待执行的用户任务获取线程,如果可以,则将获取到的线程返回给所述待执行用户任务,如果不可以,则返回异常提示消息。

优选的,所述根据预设的线程替换规则,判断在所述线程池中的其他线程集合中是否可以为所述待执行的用户任务获取线程,如果可以,则将获取到的线程返回给所述待执行用户任务,如果不可以,则返回异常提示消息,具体为:

根据预设的顺序或随机在所述线程池中选择一个替换线程集合;

如果所述替换线程集合中当前包含空闲线程,则将所述空闲线程返回给所述待执行用户任务,并记录所述待执行用户任务所使用的所述空闲线程所属的线程集合及其在所述线程池中的位置;

如果所述替换线程集合中当前没有包含空闲线程,则判断所述替换线程集合是否可以创建新的线程,如果可以,则创建新的线程,并将所述新的线程返回给所述待执行用户任务,并记录所述待执行用户任务所使用的所述新的线程所属的线程集合及其在所述线程池中的位置;

如果所述替换线程集合不能创建新的线程,则继续选择下一个替换线程集合尝试寻找空闲线程或创建新的线程给所述待执行用户任务;

当所述线程池中的所有线程集合都无法为所述待执行任务提供空闲线程或创建新的线程时,返回异常提示消息。

优选的,所述判断所述替换线程集合是否可以创建新的线程,具体为:

根据所述替换线程集合中的当前线程数量以及为各所述线程集合设置最大线程数量,判断所述替换线程集合是否可以创建新的线程

当所述替换线程集合中的当前线程数量小于为各所述线程集合设置最大线程数量时,则确定所述替换线程集合可以创建新的线程;

当所述替换线程集合中的当前线程数量等于或大于为各所述线程集合设置最大线程数量时,则确定所述替换线程集合不可以创建新的线程。

优选的,所述分别确定各待执行用户任务所归属的线程集合,具体包括:

分别获取当前所接收到的各待执行用户任务的ID;

分别根据所述各待执行用户任务的ID对所述线程池中所划分的线程集合个数进行取模;

根据相应的取模结果分别确定所述各待执行用户任务所归属的线程集合。

另一方面,本申请还提供了一种线程获取设备,包括:

线程管理模块,用于在应用服务器启动时,将线程池划分为多个线程集合;

定位模块,用于当确认用户任务需要从所述线程池中获取线程进行执行操作时,在所述线程管理模块所划分的各线程集合中,分别确定各待执行用户任务所归属的线程集合;

判断模块,用于分别判断所述定位模块所确定的各线程集合中是否有空闲线程;

处理模块,用于当所述判断模块判断当前线程集合中有空闲线程时,将所述空闲线程返回给归属到所述当前线程集合的待执行用户任务。

优选的,所述线程管理模块,还用于:

在将所述线程池划分为多个线程集合之后,为各所述线程集合设置最小线程数量和最大线程数量;

为各所述线程集合创建最小线程数量的线程;

初始化包含所述最小线程数量的线程的各所述线程集合。

优选的,所述处理模块,具体用于:

所述判断模块,还用于当判断所述当前线程集合中没有空闲线程时,判断在所述当前线程集合中执行操作的用户任务数量是否大于所述线程管理模块为所述线程集合设置的最大线程数量;

所述处理模块,还用于在所述判断模块的判断结果为没有大于时,在所述当前线程集合中创建一个线程,供归属到所述当前线程集合的待执行用户任务使用,或在所述判断模块的判断结果为大于时,根据预设的线程替换规则,判断在所述线程池中的其他线程集合中是否可以为所述待执行的用户任务获取线程,如果可以,则将获取到的线程返回给所述待执行用户任务,如果不可以,则返回异常提示消息。

优选的,所述定位模块,具体用于:

分别获取当前所接收到的各待执行用户任务的ID;

分别根据所述各待执行用户任务的ID对所述线程管理模块在所述线程池中所划分的线程集合个数进行取模;

根据相应的取模结果分别确定所述各待执行用户任务所归属的线程集合。

与现有技术相比,本申请实施例所提出的技术方案具有以下优点:

通过应用本申请实施例所提出的技术方案,解决了现有技术在通过线程池并发获得线程的时候,需要进行加锁判断线程是否空闲,排队获取线程,从而导致获取线程效率低下的问题。本申请实施例所提出的技术方案在应用程序获取线程池中的线程执行操作时,不需要进行加锁,尽量减少了任务与任务之间的资源争用,提高了获取执行任务的线程的效率,进而增强应用程序的伸缩性和健壮性。

附图说明

为了更加清楚地说明本申请实施例的技术方案,下面将对本申请实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据本申请实施例的这些附图获得其他的附图。

图1为本申请实施例所提出的一种线程获取方法的流程示意图;

图2为本申请实施例所提出的一种具体实施例中线程获取方法的流程示意图;

图3为本申请实施例所提出的一种线程获取设备的结构示意图。

具体实施方式

正如本申请背景技术所陈述的,现有方案中,在通过线程池并发获得线程时,需要进行加锁判断线程是否空闲,排队获取线程,从而,导致获取线程效率低下。

为克服现有技术中的缺陷,本申请实施例提出了一种线程获取方法解决了现有技术在通过线程池并发获得线程的时候,需要进行加锁判断线程是否空闲,排队获取线程,从而导致获取线程效率低下的问题。

实施例一

如图1所示,为本申请实施例所提出的一种线程获取方法的流程示意图,该方法具体包括以下步骤:

步骤S101、在应用服务器启动时,将线程池划分为多个线程集合。

在具体的应用场景中,为了实现后续的线程处理,在本步骤进行线程集合划分之后,还包括以下处理:

首先,为所划分的各所述线程集合设置最小线程数量和最大线程数量。

根据设置结果,为各所述线程集合创建最小线程数量的线程,然后,初始化包含所述最小线程数量的线程的各所述线程集合。

需要说明的是,在上述处理中,之所以在本申请实施例中只是创建最小线程数量的线程,原因具体如下:

首先,在线程池技术中,创建线程是一个很耗费计算机资源的工作,所以,应该尽量减少线程创建操作。但如果预先不进行线程的创建,而是在有任务来临的时候才进行线程创建的话,则响应时间中将会包含线程创建这一步所损耗的时间,从而,会使得响应时间变慢。

基于上述考虑,本申请实施例所提出的技术方案在服务启动时,便预先创建一个最小线程数量的线程,以此来满足日常需求,从而,在一般情况下,当接收到用户任务时,可以直接利用已创建的线程,而不需要再新建线程。

另一方面,设置最大线程数量是因为:如果任务突然暴增,而此时最小线程明显不够使用,则服务器会新创建线程来实现更好的响应,但是,因为计算机资源也是有限的,因此,会规定一个最大线程数量,一旦超过这一数量,则不会继续创建新的线程,因为再创建的话,会使得应用服务器的服务能力下降。

因此,对于本申请实施例所提出的技术方案,在一般情况下,会在应用服务器启动时,对每个线程集合创建最小线程数量的线程,而如果任务数量暴增,则会在线程池中创建新的线程供新任务使用,但是不会创建超过最大线程数量的线程。

在完成本步骤的处理之后,当确认一个或多个待执行用户任务需要从所述线程池中获取线程进行执行操作时,执行步骤S102。

步骤S102、分别确定各待执行用户任务所归属的线程集合。

具体的,本步骤的处理可以为:

分别获取当前所接收到的各待执行用户任务的ID;

分别根据所述各待执行用户任务的ID对所述线程池中所划分的线程集合个数进行取模;

根据相应的取模结果分别确定所述各待执行用户任务所归属的线程集合。

在本实施例中由于在应用服务器启动时,就创建了一个由多个所述线程集合所组成的线程池;当确认用户任务需要获取线程进行执行操作时,可以根据不同的用户任务的ID定位不同的线程集合,从而使得在通过线程池并发获得线程的时候,不需要进行加锁判断线程是否空闲,为进一步获取线程的提高了效率。

步骤S103、分别判断所确定的各线程集合中是否有空闲线程。

当判断当前线程集合中有空闲线程时,执行步骤S104。

步骤S104、将所述空闲线程返回给归属到所述当前线程集合的待执行用户任务。

通过上述的处理,可以实现在存在空闲线程的情况下,为归属到每个线程集合中的待执行用户任务分配相应的空闲线程的处理,从而,即使在多线程并发的情况下,也可以通过多个线程集合来实现各待执行用户任务的线程分配,从而可以解决现有技术在通过线程池并发获得线程的时候,需要进行加锁判断线程是否空闲,排队获取线程,从而导致获取线程效率低下的问题。

为了更加完整的说明本申请实施例所提出的技术方案,本实施例进一步说明在步骤S103中,当前线程集合中没有空闲线程时的后续处理过程,具体说明如下:

当判断当前线程集合中没有空闲线程时,判断在所述当前线程集合中执行操作的用户任务数量是否大于步骤S101中为所述线程集合设置的最大线程数量。

如果没有大于,,说明此时的线程集合还未饱和,则在所述当前线程集合中创建一个线程,供归属到所述当前线程集合的待执行用户任务使用。

如果大于,说明此时的当前线程集合已经饱和,则根据预设的线程替换规则,判断在所述线程池中的其他线程集合中是否可以为所述待执行的用户任务获取线程,如果可以,则将获取到的线程返回给所述待执行用户任务,如果不可以,则返回异常提示消息。

为了充分利用线程池中的线程资源,在当前线程集合没有资源可以创建线程的情况下,可以调用其他线程集合中的线程资源,而为了整体资源的合理调度,本申请实施例进一步引入了上述的线程替换规则,在具体的应用场景中,上述的应用线程出处理过程具体可以如下:

首先,根据预设的顺序或随机在所述线程池中选择一个替换线程集合。

如果所述替换线程集合中当前包含空闲线程,则将所述空闲线程返回给所述待执行用户任务,并记录所述待执行用户任务所使用的所述空闲线程所属的线程集合及其在所述线程池中的位置。

如果所述替换线程集合中当前没有包含空闲线程,则判断所述替换线程集合是否可以创建新的线程。

如果所述替换线程集合可以创建新的线程,则创建新的线程,并将所述新的线程返回给所述待执行用户任务,并记录所述待执行用户任务所使用的所述新的线程所属的线程集合及其在所述线程池中的位置。

如果所述替换线程集合不能创建新的线程,则继续选择下一个替换线程集合尝试寻找空闲线程或创建新的线程给所述待执行用户任务。

当所述线程池中的所有线程集合都无法为所述待执行任务提供空闲线程或创建新的线程时,返回异常提示消息。

在具体的应用场景中,上述的判断所述替换线程集合是否可以创建新的线程的操作,可以按照以下方式来实现:

根据所述替换线程集合中的当前线程数量以及为各所述线程集合设置最大线程数量,说明此时的所述替换线程集合还未饱和,则判断所述替换线程集合是否可以创建新的线程。

当所述替换线程集合中的当前线程数量小于为各所述线程集合设置最大线程数量时,则确定所述替换线程集合可以创建新的线程。

当所述替换线程集合中的当前线程数量等于或大于为各所述线程集合设置最大线程数量时,则确定所述替换线程集合不可以创建新的线程。

在具体的应用场景中,判断线程池中的其他线程集合是否包含空闲线程,以及在没有空闲线程的情况下是否可以创建新线程的操作,为充分利用线程池中的线程资源提供了一套可以实现分层演进的资源替代方案,而且相应的替换操作在一定时间区间内会集中在一个线程集合中进行,这不会干扰其他 线程集合的正常操作,无需像现有技术一样进行加锁和排队的处理,提高了并发线程的场景下,资源调度和分配的效率。

通过应用本申请实施例所提出的技术方案,解决了现有技术在通过线程池并发获得线程的时候,需要进行加锁判断线程是否空闲,排队获取线程,从而导致获取线程效率低下的问题。本申请实施例所提出的技术方案在应用程序获取线程池中的线程执行操作时,不需要进行加锁,尽量减少了任务与任务之间的资源争用,提高了获取执行任务的线程的效率,进而增强应用程序的伸缩性和健壮性。

实施例二

为了进一步阐述本申请的技术方案,现结合具体的应用场景,对本申请的技术方案进行说明,如图2所示,本实施例提出的一种线程获取方法,应用于应用服务器中,该方法具体包括以下步骤:

步骤S201,在应用服务器启动时创建一个线程池,所述线程池由多个线程集合组成,为各所述线程集合创建最小线程数量的线程,然后,初始化包含所述最小线程数量的线程的各所述线程集合。

在本申请优选地实施例中,在应用服务启动时,创建一个由多个线程集合组成的线程池相当于将原来的一个大的线程集合,分为几个小的线程集合,这几个小的线程集合组成一个线程池,当确定用户任务需要获取用户任务时,可以根据不同的用户任务ID定位到不同的线程集合中,从而使得不同的用户任务并发获取线程的过程中不需要进行加锁,提高了线程获取的效率。

在应用服务启动时,之所以先为各所述线程集合创建最小线程数量的线程,是因为创建线程是一个很耗费计算机资源的工作,当有任务来临,在创建线程,则响应时间中包含线程创建这一步,会使得响应时间变慢,因此在应用服务启动时,先为各所述线程集合创建最小线程数量的线程,此时满足 日常需求,如果有应用任务需要获取线程,则可以直接利用线程,不需要再临时新建线程。

在应用服务启动时,之所以设置最大线程数量,是为了使应用服务器在现有的服务能力范围内更好的工作。例如,如果在应用服务器启动时,为线程集合设置了10个最小线程数量,当用户任务需要获取的线程数量突然增加,例如需要500个线程,此时最小线程数量明显不够使用,则应用服务器会创建新的线程来更好的响应,但是因为计算机资源也是有限的,因此需要给个线程集合设定一个最大线程数量,比如设置最大线程数量为100,则即使超过100,也不会再在该线程集合中创建新的线程,因为再创建新的线程,会使得应用服务器的服务能力下降。因此,设置最大线程数量是为了使应用服务器在现有的服务能力范围内更好的工作。

步骤S202,当确认用户任务需要获取线程进行执行操作时,根据所述用户任务的ID定位所述线程池中的所述线程集合。

在本申请优选的实施例中,所述根据所述用户任务的ID定位线程池中的线程集合,具体包括:

根据所述用户任务的ID对所述线程池中的线程集合个数进行取模,获得模值,根据所述模值定位相应的线程集合。从而使得不同的用户任务定位到不同的相应的线程集合中。使得不同的用户任务并发获取线程的过程中不需要进行加锁,提高了线程获取的效率。

步骤S203,判断所述线程集合中是否有空闲线程。

当所述线程集合中有空闲线程时,执行步骤S204;

当所述线程集合中没有空闲线程,执行步骤S205。

步骤S204,将所述空闲线程返回给用户任务。

步骤S205,判断是否可以在所述线程集合中创建新的线程任务。

所述判断依据为当前执行操作的用户任务数小于为所述线程集合设置的 最大线程数量。

若可以在所述线程集合中创建新的线程任务,则执行步骤S206;

若不可以在所述线程集合中创建新的线程任务,则执行步骤S207。

步骤S206,创建一个线程供用户任务使用。

步骤S207,判断所述线程池中的其他线程集合中是否包含空闲线程。

若所述线程池中的其他线程集合中包含空闲线程,则执行步骤S208;

若所述线程池中的其他线程集合中不包含空闲线程,则执行步骤S209。

步骤S208,将所述空闲线程返回给用户任务,并记录当前用户任务使用线程所属的线程集合及其在所述线程池中的位置。

步骤S209,判断是否可以在所述线程池中的其他线程集合中创建新的线程;

所述判断依据为所述其他线程集合中的线程数是否小于为所述其他线程集合设置的最大线程数量。

若可以在所述线程池中的其他线程集合中创建新的线程,则执行步骤S210;

若不可以在所述线程池中的其他线程集合中创建新的线程,则执行步骤S211。

步骤S210,创建新的线程,将所述新的线程返回给用户任务,并记录当前用户任务使用线程所属的线程集合及其在所述线程池中的位置。

步骤S211,显示当前没有可用线程的异常说明。

通过应用本申请实施例所提出的技术方案,解决了现有技术在通过线程池并发获得线程的时候,需要进行加锁判断线程是否空闲,排队获取线程,从而导致获取线程效率低下的问题。本申请实施例所提出的技术方案在应用程序获取线程池中的线程执行操作时,不需要进行加锁,尽量减少了任务与任 务之间的资源争用,提高了获取执行任务的线程的效率,进而增强应用程序的伸缩性和健壮性。

实施例三

基于与上述线程获取方法实现流程同样的申请构思,本申请实施例中还提供了一种线程获取设备,如图3所示,所述设备包括:

线程管理模块31,用于在应用服务器启动时,将线程池划分为多个线程集合;

定位模块32,用于当确认用户任务需要从所述线程池中获取线程进行执行操作时,在所述线程管理模块31所划分的各线程集合中,分别确定各待执行用户任务所归属的线程集合;

判断模块33,用于分别判断所述定位模块32所确定的各线程集合中是否有空闲线程;

处理模块34,用于当所述判断模块33判断当前线程集合中有空闲线程时,将所述空闲线程返回给归属到所述当前线程集合的待执行用户任务。

在具体的应用场景中,所述线程管理模块31,还用于:

在将所述线程池划分为多个线程集合之后,为各所述线程集合设置最小线程数量和最大线程数量;

为各所述线程集合创建最小线程数量的线程;

初始化包含所述最小线程数量的线程的各所述线程集合。

进一步的,

所述判断模块33,还用于当判断所述当前线程集合中没有空闲线程时,判断在所述当前线程集合中执行操作的用户任务数量是否大于所述线程管理模块31为所述线程集合设置的最大线程数量;

所述处理模块34,还用于在所述判断模块33的判断结果为没有大于时, 在所述当前线程集合中创建一个线程,供归属到所述当前线程集合的待执行用户任务使用,或在所述判断模块33的判断结果为大于时,根据预设的线程替换规则,判断在所述线程池中的其他线程集合中是否可以为所述待执行的用户任务获取线程,如果可以,则将获取到的线程返回给所述待执行用户任务,如果不可以,则返回异常提示消息。

在具体的应用场景中,所述定位模块32,具体用于:

分别获取当前所接收到的各待执行用户任务的ID;

分别根据所述各待执行用户任务的ID对所述线程管理模块31在所述线程池中所划分的线程集合个数进行取模;

根据相应的取模结果分别确定所述各待执行用户任务所归属的线程集合。

通过应用本申请实施例所提出的技术方案,解决了现有技术在通过线程池并发获得线程的时候,需要进行加锁判断线程是否空闲,排队获取线程,从而导致获取线程效率低下的问题。本申请实施例所提出的技术方案在应用程序获取线程池中的线程执行操作时,不需要进行加锁,尽量减少了任务与任务之间的资源争用,提高了获取执行任务的线程的效率,进而增强应用程序的伸缩性和健壮性。

其中,本申请装置的各个模块可以集成于一体,也可以分离部署。上述模块可以合并为一个模块,也可以进一步拆分成多个子模块。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实 施例所述的方法。本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本申请所必须的。本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。以上公开的仅为本申请的几个具体实施例,但是,本申请并非局限于此,任何本领域的技术人员能思之的变化都应落入本申请的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1