首页> 中国专利> 支持自动晋升的任务管理方法、装置、设备及存储介质

支持自动晋升的任务管理方法、装置、设备及存储介质

摘要

本发明实施例提供一种支持自动晋升的任务管理方法、装置、设备及存储介质,方法包括:声明一个任务数组、任务读取指针以及任务插入指针;所述任务数组按照循环队列的方式声明;按照设定的规则移动所述任务插入指针,以改变所述任务插入指针指向的槽位以及各个槽位之间的优先级,并实现任务在槽位间的插入;根据任务读取指针的读取指针值以及每个任务的优先级值控制任务读取指针对任务的读取以及任务读取指针的移动。本发明将数组通过循环队列的方式来表达不同的优先级,通过任务写指针的移动来实现内部任务优先级的晋升,通过读指针来实现任务严格按照优先级顺序被处理,且避免低优先级任务被高优先级任务饿死。

著录项

  • 公开/公告号CN113687930B

    专利类型发明专利

  • 公开/公告日2023.06.23

    原文格式PDF

  • 申请/专利权人 厦门市易联众易惠科技有限公司;

    申请/专利号CN202111004170.3

  • 申请日2021.08.30

  • 分类号G06F9/48(2006.01);

  • 代理机构厦门智慧呈睿知识产权代理事务所(普通合伙) 35222;

  • 代理人陈晓思

  • 地址 361000 福建省厦门市软件园二期观日路18号504之一

  • 入库时间 2023-08-03 18:37:02

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-06-23

    授权

    发明专利权授予

说明书

技术领域

本发明涉及计算机技术领域,具体而言,涉及一种支持自动晋升的任务管理方法、装置、设备及存储介质。

背景技术

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。

在JDK中内置多种不同策略的线程池实现,这些实现基于统一的底层,只是更换了一些不同的策略,具体策略上有:

任务队列的长度,是无限长度的链表队列还是有限长度的数组队列;

线程池的最小线程池、最大线程数、线程销毁的空闲时间;

任务队列满时,无法添加任务时的拒绝措施:使用当前线程执行任务、抛弃任务、抛出错误提示;

但是所有的这些策略,均不能解决如下的业务场景需求:

(1)添加外部带优先级属性的任务到线程池;

(2)随着时间流逝,线程池内部的低优先级任务会自动晋级为高优先级任务,以避免被不断新增的高优先级任务阻塞导致永远无法执行而被饿死。

发明内容

有鉴于此,本发明的目的在于提供一种患病风险预警方法、装置、设备及存储介质,以改善上述问题。

本发明实施例提供了一种支持自动晋升的任务管理方法,其包括:

声明一个任务数组、任务读取指针以及任务插入指针;其中,所述任务数组按照循环队列的方式声明,所述任务数组包括预定顺序循环组成的多个槽位,每个槽位挂载有任务列表;所述任务插入指针用于指向其中一个槽位,且所述任务插入指针指向的槽位为当前优先级最高的槽位,所述任务读取指针用于指向并读取任务列表中的一个任务;所述任务读取指针具有一个读取指针值,所述任务列表中的每个任务具有一个优先级值;

按照设定的规则移动所述任务插入指针,以改变所述任务插入指针指向的槽位以及各个槽位之间的优先级,并实现任务在槽位间的插入;

根据任务读取指针的读取指针值以及每个任务的优先级值控制任务读取指针对任务的读取以及任务读取指针的移动。

优选地,按照设定的规则移动所述任务插入指针,以改变所述任务插入指针指向的槽位以及各个槽位之间的优先级,具体包括:

获取任务读取指针的读取次数;

当读取次数达到设定的阈值时,将所述任务插入指针移动到下一个槽位;其中,移动后指向的下一个槽位具有最高优先级,移动前指向的槽位具有最低的优先级。

优选地,每个槽位的任务队列由至少一个分段队列组成,每个分段队列均用于存储具有相同优先级的任务。

优选地,所述任务插入指针具有一个插入指针值,所述任务插入指针在执行任务插入的具体步骤包括:

获取待插入任务的任务优先级t以及所述任务插入指针当前的插入指针值w;

根据插入指针值w以及任务优先级t获得插入优先级v;

对插入优先级v进行散列后获取当前指向的槽位上的分段队列的分段优先级;

判断所述分段队列的分段优先级是否等于插入优先级v;

若是,则将所述待插入任务插入到所述分段队列;

若否,则尝试获取下一个分段队列;

判断下一个分段队列是否存在;

若存在,则返回步骤:判断所述分段队列的分段优先级是否等于插入优先级v;

若不存在,则使用v作为插入优先级声明一个新的分段队列。

优选地,在将所述待插入任务插入到所述分段队列之后,还包括:

判断该分段队列的分段状态是否为终止状态;

若否,则完成任务插入;

若是,则提取所述分段队列内的任务,并为每一个任务重新执行插入步骤。

优选地,根据任务读取指针的读取指针值以及每个任务的优先级值控制任务读取指针对任务的读取以及任务读取指针的移动,具体包括:

获取任务读取指针的读取指针值r;

通过散列获取当前槽位上的分段队列的分段优先级;

判断所述分段优先级是否小于r;

若所述分段优先级小于r时,进一步判断是否有下一个分段优先级;

若没有,则控制任务读取指针进行移动;

若有,则更新下一个分段队列到槽位,并返回步骤:通过散列获取当前槽位上的分段队列的分段优先级;

若所述分段优先级不小于r时,则进一步判断该分段优先级是否等于r;

若不等于,则控制任务读取指针进行移动;

若等于,则判断分段队列中是否存在任务;

若存在,则提取并返回任务;

若不存在,则判断分段状态是否为终止;

若不为终止,则更新分段状态为终止,并返回步骤:通过散列获取当前槽位上的分段队列的分段优先级;

若为终止,则判断是否有下一个分段队列;

若有,则将下一个分段队列更新到槽位后,控制任务读取指针进行移动;

若没有,则直接控制任务读取指针进行移动。

优选地,控制任务读取指针进行移动具体包括:

根据所述任务插入指针的插入指针值w以及最低优先级值之后,生成wB;

判断r是否小于wB;

若是,则将读取指针值从r更新为r+1,并返回步骤:通过散列获取当前槽位上的分段队列的分段优先级;

若否,则返回NULL。

本发明实施例还提供了一种支持自动晋升的任务管理装置,其包括:

声明单元,用于声明一个任务数组、任务读取指针以及任务插入指针;其中,所述任务数组按照循环队列的方式声明,所述任务数组包括预定顺序循环组成的多个槽位,每个槽位挂载有任务列表;所述任务插入指针用于指向其中一个槽位,且所述任务插入指针指向的槽位为当前优先级最高的槽位,所述任务读取指针用于指向并读取任务列表中的一个任务;所述任务读取指针具有一个读取指针值,所述任务列表中的每个任务具有一个优先级值;

任务插入指针移动单元,用于按照设定的规则移动所述任务插入指针,以改变所述任务插入指针指向的槽位以及各个槽位之间的优先级,并实现任务在槽位间的插入;

任务读取指针移动单元,用于根据任务读取指针的读取指针值以及每个任务的优先级值控制任务读取指针对任务的读取以及任务读取指针的移动。

本发明实施例还提供了一种支持自动晋升的任务管理设备,其包括存储器以及处理器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如上述的患病风险预警方法。

本发明实施例还提供了一种计算机可读存储介质,其存储有计算机程序,所述计算机程序能够被所述计算机可读存储介质所在设备的处理器执行,以实现如上述的支持自动晋升的任务管理方法。

综上所述,本实施例中,将数组通过循环队列的方式来表达不同的优先级,通过任务写指针的移动来实现内部任务优先级的晋升,通过读指针来实现任务严格按照优先级顺序被处理,且避免低优先级任务被高优先级任务饿死。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1是本发明第一实施例提供的支持自动晋升的任务管理方法的流程示意图。

图2是任务数组的数据结构图。

图3是任务插入指针的工作原理示意图。

图4是任务读取指针的工作原理示意图。

图5是本发明实施例提供的一个例子的任务执行顺序图。

图6是本发明第二实施例提供的支持自动晋升的任务管理装置的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为了更好的理解本发明的技术方案,下面结合附图对本发明实施例进行详细描述。

应当明确,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。

下面结合附图与具体实施方式对本发明作进一步详细描述:

请参阅图1,本发明第一实施例提供了一种支持自动晋升的任务管理方法,其可由其支持自动晋升的任务管理设备(以下简称管理设备)来执行,特别的,由所述管理设备内一个或者多个处理器来执行,以实现如下步骤:

S101,声明一个任务数组、任务读取指针以及任务插入指针;其中,所述任务数组按照循环队列的方式声明,所述任务数组包括预定顺序循环组成的多个槽位,每个槽位挂载有任务列表;所述任务插入指针用于指向其中一个槽位,且所述任务插入指针指向的槽位为当前优先级最高的槽位,所述任务读取指针用于指向并读取任务列表中的一个任务;所述任务读取指针具有一个读取指针值,所述任务列表中的每个任务具有一个优先级值。

在本实施例中,所述管理设备可为个人计算机、笔记本电脑、台式电脑、服务器或者工作站等具有数据处理能力的计算设备,本发明对此不做赘述。

在本实施例中,如图2所示,所述任务数组按照循环队列的方式使用。每一个数组的槽位上都挂载一个任务列表。有一个指针指向数组中的某一个槽位,该槽位即为当前最高优先级任务插入的槽位。指针数字递增方向优先级依次降低。指针以某种方式沿递增方向移动,因为指针指向的槽位代表最高优先级,因此指针的移动实际上意味着所有槽位的优先级都晋升了。

在本实施例中,优先级采用离散化的整型数字。例如,优先级的范围为0到数组长度减1,最高优先级为0。

在本实施例中,如果只有一个指针,意味着读取任务时,从该指针指向的槽位读取,因此此时指针指向的槽位是最高优先级。而插入任务的时候,需要根据当前指针进行计算。这种模式在优先级晋升时存在并发问题,具体地:

当指针从槽位1指向更新到槽位2,此时槽位1可能还存在部分剩余的任务,这部分任务的实际优先级应该是高于槽位2当中的。而如果在这个时候插入最低优先级的任务,可能就会插入到槽位1中。那么槽位1的任务队列实际就混合了最高优先级和最低优先级的任务,无法区分。

为了解决不同优先级任务在同一个队列中混合的问题,可以在指针移动时,将之前槽位的剩余移动到当前槽位的队列头。这实际上就意味着要求队列是处于双端队列模式。但是因为指针移动和任务移动无法原子化进行,还是会造成槽位1的队列中最高优先级任务和最低优先级任务混在一起的情况。

从实现效果而言,需要的是在指针移动的时候,保证槽位1中剩余的原本高优先级的任务执行完毕后才能去执行槽位2这个“原本的次高优先级,现在的最高优先级“的任务。从效果来看,并不需要一定移动任务,可以通过一种手段,保证槽位1中原本高优先级任务执行完毕后再去执行槽位2的任务即可。

基于这种考量,本实施例采用了双指针的方案,即任务插入指针和任务读取指针,基于并发读写的考虑,两个指针都是AtomicInteger类型。两个指针的作用分别为:

任务插入指针:该指针指向的槽位为当前最高优先级槽位。

任务读取指针:从结构体中获取任务时使用该指针指向的槽位上获取任务队列进行任务读取。

任务插入指针和任务读取指针分离的好处在于,任务插入指针的移动意味着不同槽位优先级的实际晋升。而读取可以依照任务读取指针指向的槽位上的队列读取任务,直到对应优先级的任务读取完毕后再移动任务读取指针到下一个槽位。这样一来,保证了按照入列的顺序被公平的处理,也保证了同一个时间单位高优先级的任务优于低优先级任务被处理,也避免了单一指针移动需要的任务拷贝带来的不同优先级任务污染问题。

S102,按照设定的规则移动所述任务插入指针,以改变所述任务插入指针指向的槽位以及各个槽位之间的优先级,并实现任务在槽位间的插入。

S103,根据任务读取指针的读取指针值以及每个任务的优先级值控制任务读取指针对任务的读取以及任务读取指针的移动。

在本实施例中,任务插入指针可以按照两种策略移动:

策略一:自然时间流逝移动,在一定时间后移动。

策略二:以读取次数为单位,在一定读取次数后移动。

如果选择策略一,需要后台配置一个线程,按照固定时间移动任务插入指针;如果选择策略二,需要一个全局的AtomicInteger对象,用于次数判定。

如果选择策略一,可能会存在一种场景,往线程池中投入了大量的同一个优先级的任务,使得某个槽位上的队列长度很长。如果任务处理相对缓存,则任务插入指针可能会被移动多次。这种移动会使得槽位上队列有了很多不同优先级的任务。而读取任务时按照优先级逐步去处理,这使得产生了这么多不同的优先级实际上意义是不大的。

因此采用策略二会更加合适一些。

由于读取任务时是多线程的,因此策略二实现上需要注意的点包括:

(1)、AtomicInteger#incrementAndGet实现任务读取次数累加。如果返回的数字是阈值的倍数,则意味着可以移动任务插入指针。

在这里对任务插入指针移动的并发考量在于,由于读取线程对读取计数使用AtomicInteger#incrementAndGet方式累加是必然成功,而返回数值是晋升阈值的倍数时必然需要实现任务插入指针的递增。因为递增的必然性,因此同样使用AtomicInteger#incrementAndGet方式来实现。

(2)、任务插入指针移动到同一位置导致的优先级任务混合问题

假定系统初始状态,任务插入指针和任务读取指针都指向了槽位1,在槽位1上插入了大量的任务。随着任务的读取,任务插入指针移动到了槽位2,此时该槽位上插入了一些任务。随着任务的读取,任务插入指针继续移动,移动过数组的长度后,再次指向了槽位2。假定此时任务读取指针仍然在槽位1,而如果这个时候插入任务。那么实际上槽位2队列中任务应该分为两种:前半部分是上一个轮次插入的任务,后半部分是当前刚插入的任务。

如果任务读取指针移动到槽位2,应该将前半部分任务执行完毕后就去执行槽位3上的任务,而不是将所有的任务都执行完。因此槽位3上的任务实际优先级应该高于槽位2队列中后半部分的任务。

基于上述情况,问题可以转化为依靠任务读取指针在读取任务时,如何识别当前队列中不是本轮次要处理的任务进而移动任务读取指针?

考虑到任务插入指针和任务读取指针本身是有值的,这个值单调递增,实际上可以看成是一种“顺序”概念的表达。因此任务的准备添加时,可以将任务插入指针的插入指针值w加上任务的任务优先级t,声明为任务的插入优先级v,即v=w+t。任务读取指针在读取任务时,只有当前任务的插入优先级v等于任务读取指针的读取指针值,意味着该任务是本轮次任务读取指针应该要处理的任务。如果读取的任务的插入优先级v与读取指针值w不等时,意味着当前队列不能再读取任务,应该移动任务读取指针。

通过任务本身的插入优先级v避免了不同轮次的任务在一个队列中被混合导致的优先级混乱。

综上所述,本实施例中,将数组通过循环队列的方式来表达不同的优先级,通过任务写指针的移动来实现内部任务优先级的晋升,通过读指针来实现任务严格按照优先级顺序被处理,且避免低优先级任务被高优先级任务饿死。

为便于对本发明的理解,下面对本发明的一些优选实施例做更进一步代的描述。

上述实施例中提出任务的插入优先级v,解决了不同轮次的任务在同一个队列可能会混合的问题。这个问题的解决引出了任务读取指针的移动策略:在读取到的任务的插入优先级与任务读取指针的值不等时意味着需要移动。

但是这里又产生了新的问题,即并发移动任务读取指针的问题。

在读取并发的情况下,会遇到一个问题:读取出来的任务的插入优先级v不符合指针要求,此时要重新放回任务队列中,但是重新放入,就可能和任务的插入混合,造成数据混乱。

有几种可能的解决方式:

策略一、任务的读取采用Sync关键字修饰,如果读取任务不符合,则放回,并且移动指针。由于没有读取并发,但仍然可能因为读取的放回和新任务的添加造成数据混乱。

策略二、采用分段机制,每一个分段是一个队列,分段和分段构成一个队列。一个分段内的优先级是固定的,因此当分段耗尽时,就是切换任务读取指针的时候。

策略一并不能彻底解决问题,在本实施例中采用策略二的方案。

策略二的引入实际上改变了上面的一个数据结构,也即是数组存储的元素不再是一个任务队列,而是一个分段队列。而每一个分段队列内部又存储了任务队列,并且同一个分段队列的任务的插入优先级均是相同的。这意味着分段队列在创建的时候就具备了插入优先级v这个属性值。不同分段队列的插入优先级必然不同,在分段队列内数据耗尽,就意味着某个具体插入优先级的任务都被读取完毕了,可见这个结构就天然的支持了轮次的概念。

分段队列的引入导致了数据结构的变化,这实际上会改变任务插入和任务读取的流程。

具体而言,插入和读取可能在同一个槽位同一个分段上并发。分段的队列本身是支持MPMC的,这并没有问题。然而可能会出现一种并发异常就是插入线程读取了任务插入指针的值,并且准备插入数据,但是因为线程调度的原因,失去了CPU资源,尚未完成数据插入。此时读取线程将槽位内的任务读取完毕后认为没有数据,则移动了任务读取指针到下一个槽位。在任务读取指针移动后,插入线程才完成数据的插入。这样导致本来应该是高优先级的任务变成最低优先级槽位上的任务。而当下一轮次任务读取指针再次指向该槽位时,任务读取指针获取的到任务的任务优先级又会和任务读取指针本身的数值冲突。

针对并发的异常场景,有一种常见的解决思路就是二次检查。也就是读取线程在移动任务读取指针后,再次检查下当前分段内是否出现了新的任务,如果有,则协助迁移到下一个槽位上;写入线程在放入任务后,检查是否任务读取指针移动过,如果有,则协助迁移到下一个槽位上。

然而,读取线程检查分段内的队列是否剩余,写入线程检查任务读取指针是否移动,这些状态都是在动态变化的,仍然会产生一些其他问题。双重检查一般会引入一个终止状态来来减少可能的变化场景。为此,本实施例为分段引入状态:使用中和终止。一个分段初始化时是使用中状态,当读取线程认为该分段内的任务都被消耗后,则应该更新为终止状态。一旦分段进入终止状态,则被抛弃,不应该再有任务数据添加到该分段中。

通过设置分段队列的状态,本实施例可以将任务区分为终止前添加到分段和终止后添加到分段两类。前者需要被正常读取,后者则需要迁移到其它合适的分段中再被处理。

到这里为止,针对数据结构和其元素属性的变化就完成了。以下将进行详细的实现阐述。

(1)、任务插入指针的移动

对于插入线程而言,要处理的情况包括有:

1、元素对应槽位上没有分段。

2、元素对应槽位上的分段的插入优先级和任务插入指针的插入指针值不相等。

3、元素对应槽位上分段列表中插入优先级与任务插入指针相符的分段处于终止状态

4、元素对应槽位上的分段插入优先级与任务插入指针相等,且处于使用状态。

可以看到,只有第四种情况任务可以在当前分段插入成功,且插入完毕后还需要再次检查分段的状态。基于这些考量,请参阅图3,任务插入指针在执行任务插入的具体步骤:

获取待插入任务的任务优先级t以及所述任务插入指针当前的插入指针值w;

根据插入指针值w以及任务优先级t获得插入优先级v;

对插入优先级v进行散列后获取当前指向的槽位上的分段队列的分段优先级;

判断所述分段队列的分段优先级是否等于插入优先级v;

若是,则将所述待插入任务插入到所述分段队列;

判断该分段队列的分段状态是否为终止状态;

若否,则完成任务插入;

若是,则提取所述分段队列内的任务,并为每一个任务重新执行插入步骤;

若否,则尝试获取下一个分段队列;

判断下一个分段队列是否存在;

若存在,则返回步骤:判断所述分段队列的分段优先级是否等于插入优先级v;

若不存在,则使用v作为插入优先级声明一个新的分段队列。

(1)、任务读取指针的移动

有了分段的存在,任务读取指针的移动判定更加复杂,读取线程可能碰到的场景有:

1、任务读取指针散列的槽位上没有分段队列。

2、任务读取指针散列的槽位上有分段队列且状态为使用中,分段队列内没有任务。

3、任务读取指针散列的槽位上有分段队列且状态为使用中,分段队列内有任务。

4、任务读取指针散列的槽位上有分段队列且状态为终止,分段队列内没有任务。

5、任务读取指针散列的槽位上有分段队列且状态为终止,分段队列内有任务。

只有第三种情况可以读取任务并且进行处理。有了轮次这个概念,任务读取指针永远只会读取槽位上的第一个分段。如果槽位上没有分段队列,或者分段队列的插入优先级与读取指针值不同,或者分段队列内没有任务,则可以考虑移动任务读取指针。注意,分段状态为终止并不是任务读取指针移动的条件,原因下面会分析。

但是移动任务读取指针的时候首先需要考虑当前任务读取指针是否已经处于(写入指针的值+最低优先级数字),如果是的话,意味着已经处于边界,不应该在移动。

分段状态的更新只能由读取线程来进行。当读取线程发现该分段队列已经没有任务了,首先应该通过CAS的方式更新分段状态。CAS竞争成功的线程再次检查分段队列内是否出现了新的任务,如果出现的话,则提取任务,完成任务读取。为何不将任务移动到下一个槽位。因为下一个槽位上可能还没有分段队列,此时读取线程可能和写入线程竞争槽位上的分段写入。如果写入线程竞争成功,读取线程移动过去的任务数据的优先级就放到了错误的分段中;如果读取线程竞争成功,则读取线程创建的分段必须是第一个分段,否则任务还是移动到错误的地方。

解决这个问题最好的办法就是不解决。不移动任务,仍然在该分段队列上读取任务直到任务耗尽。然后再尝试移动任务读取指针。而对于写入线程而言,当其发现分段的状态变为终止后,是提取出任务重新执行完整的放入流程,不会有并发的问题。

再次梳理下没有任务情况下的流程,应该是通过CAS修改分段的状态。无论成功或失败,都可以继续检查队列是否有任务,如果有的话,则返回读取到的任务。如果没有的话,则CAS将读取指针值r+1。竞争成功的线程将当前分段队列的下一个分段队列设置给槽位,并且重新执行读取流程。竞争失败的线程则反复检查任务读取指针的值,发现变化后,重新执行读取流程。

这里有一个并发冲突需要考虑,当读取线程尝试将当前分段的下一个分段设置为槽位的值时,可能此时当前分段的下一个分段是null,而写入线程正在尝试为当前分段设置下一个分段。这种情况下可能导致下一个分段队列丢失。特别的,如果当前分段的下一个分段已经被设置,并且有任务被放入其中,丢失这个分段就意味着数据丢失。

为了避免这个情况,在当前分段的下一个分段为null时,就不能将下一个分段(属性值)设置给槽位。这使得在读取到分段时,需要首先检查分段的优先级,确认是否本轮次。如果是的话,再执行后续的流程。否则要么移动(该分段没有下一个分段),要么将该分段的下一个分段设置给槽位后,在移动。

从这个角度出发,可以在初始化的时候,将数组中的元素都填充一个分段队列。这样写入线程就不需要处理槽位上可能为空的场景了。

基于此,将读取任务的变化为:

槽位上的分段优先级小于任务读取指针,且分段状态为终止。

槽位上的分段优先级等于任务读取指针。

槽位上的分段优先级大于任务读取指针。

第一种情况,如果该分段有下一个分段,CAS更新到槽位上;如果没有,则CAS移动任务读取指针。

第二种情况,按照上面分析的流程进行处理即可。

第三种情况,CAS移动任务读取指针。

综上所述,任务读取指针的移动和读取流程如图4所示:

获取任务读取指针的读取指针值r;

通过散列获取当前槽位上的分段队列的分段优先级;

判断所述分段优先级是否小于r;

若所述分段优先级小于r时,进一步判断是否有下一个分段优先级;

若没有,则控制任务读取指针进行移动;

若有,则更新下一个分段队列到槽位,并返回步骤:通过散列获取当前槽位上的分段队列的分段优先级;

若所述分段优先级不小于r时,则进一步判断该分段优先级是否等于r;

若不等于,则控制任务读取指针进行移动;

若等于,则判断分段队列中是否存在任务;

若存在,则提取并返回任务;

若不存在,则判断分段状态是否为终止;

若不为终止,则更新分段状态为终止,并返回步骤:通过散列获取当前槽位上的分段队列的分段优先级;

若为终止,则判断是否有下一个分段队列;

若有,则将下一个分段队列更新到槽位后,控制任务读取指针进行移动;

若没有,则直接控制任务读取指针进行移动。

其中,控制任务读取指针进行移动具体包括:

根据所述任务插入指针的插入指针值w以及最低优先级值之后,生成wB;

判断r是否小于wB;

其中,wB即为边界值。

若是,则将读取指针值从r更新为r+1,并返回步骤:通过散列获取当前槽位上的分段队列的分段优先级;

若否,则返回NULL。

为增加对本发明的理解,下面将以一实际的例子来说明本实施例的效果:

首先添加一定量的高优先级任务,随后添加5个低优先级,最后通过CountLatch模拟在运行过程中添加高优先级任务。

如果单纯按照优先级排序,则需要所有高优先级任务输出完毕后才会输出低优先级任务,显然这是错误的。正确的实现应该是先输出第一批高优先级任务,再输出低优先级任务,最后输出第三批高优先级任务。其最终执行效果如图5所示,符合本实施例的预期。

请参阅图6,本发明第二实施例还提供了一种支持自动晋升的任务管理装置,其包括:

声明单元210,用于声明一个任务数组、任务读取指针以及任务插入指针;其中,所述任务数组按照循环队列的方式声明,所述任务数组包括预定顺序循环组成的多个槽位,每个槽位挂载有任务列表;所述任务插入指针用于指向其中一个槽位,且所述任务插入指针指向的槽位为当前优先级最高的槽位,所述任务读取指针用于指向并读取任务列表中的一个任务;所述任务读取指针具有一个读取指针值,所述任务列表中的每个任务具有一个优先级值;

任务插入指针移动单元220,用于按照设定的规则移动所述任务插入指针,以改变所述任务插入指针指向的槽位以及各个槽位之间的优先级,并实现任务在槽位间的插入;

任务读取指针移动单元230,用于根据任务读取指针的读取指针值以及每个任务的优先级值控制任务读取指针对任务的读取以及任务读取指针的移动。

本发明第三实施例还提供了一种支持自动晋升的任务管理设备,其包括存储器以及处理器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如上述的患病风险预警方法。

本发明第四实施例还提供了一种计算机可读存储介质,其存储有计算机程序,所述计算机程序能够被所述计算机可读存储介质所在设备的处理器执行,以实现如上述的支持自动晋升的任务管理方法。

在本发明实施例所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置和方法实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。

所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,电子设备,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号