一种多线程程序实现方法、装置及相关设备与流程

文档序号:30705609发布日期:2022-07-09 22:50阅读:101来源:国知局
一种多线程程序实现方法、装置及相关设备与流程

1.本发明涉及软件开发技术领域,尤其涉及一种多线程程序实现方法、装置及相关设备。


背景技术:

2.通过将cpu主频尽量提升以提高计算机系统的计算能力,计算机因此可以拥有多个cpu核心以及超线程能力。对程序开发者而言,单线程开发是一种比较直观、不易犯错的思路,可以避免多线程造成的线程池管理问题、数据依赖问题和线程安全问题。但单线程开发的程序不能完全地利用计算机的多线程性能。
3.目前,在单线程开发的基础上获取多线程程序主要采用对整个java文件进行读取和重写,这种方式容易破坏程序的直观性,可读性较差,导致重写后的java文件的修改效率降低,从而影响获取多线程程序的效率。可见,现有技术中在单线程开发的基础上获取的多线程程序的效率较低。


技术实现要素:

4.本发明实施例提供一种多线程程序实现方法、装置及相关设备,以解决在单线程开发的基础上获取的多线程程序的效率较低的问题。
5.第一方面,本发明实施例提供一种多线程程序实现方法,包括:
6.依据目标函数的抽象语法树,获取调用依赖图,所述调用依赖图包括所述目标函数的语句之间的依赖关系;
7.对所述调用依赖图进行拆分,获得包括多个线程的线程池;
8.从所述线程池中取出长度小于设定值的线程进行组合,获得组合线程;
9.在所述组合线程的长度大于或者等于所述设定值的情况下,将所述组合线程添加至所述线程池。
10.第二方面,本发明实施例提供一种多线程程序实现装置,包括:
11.获取模块,用于依据目标函数的抽象语法树,获取调用依赖图,所述调用依赖图包括所述目标函数的语句之间的依赖关系;
12.拆分模块,用于对所述调用依赖图进行拆分,获得包括多个线程的线程池;
13.组合模块,用于从所述线程池中取出长度小于设定值的线程进行组合,获得组合线程;
14.添加模块,用于在所述组合线程的长度大于或者等于所述设定值的情况下,将所述组合线程添加至所述线程池。
15.第三方面,本发明实施例还提供一种通信设备,包括:收发机、存储器、处理器及存储在所述存储器上并可在所述处理器上运行的程序;其特征在于,所述处理器,用于读取存储器中的程序实现如前述第一方面所述方法中的步骤。
16.第四方面,本发明实施例还提供一种可读存储介质,用于存储程序,所述程序被处
理器执行时实现如前述第一方面所述方法中的步骤。
17.本发明实施例中,依据目标函数的抽象语法树,获取调用依赖图;对调用依赖图进行拆分,获得包括多个线程的线程池;调取多个线程中长度小于设定值的线程进行组合,获得组合线程;在组合线程的长度不小于设定值的情况下,将组合线程放回线程池。通过组合长度较短的线程优化线程的长度,在线程池中执行程序时,可以动态地构建多线程程序,从而可以提高获取多线程程序的效率。
附图说明
18.图1是本发明实施例提供的一种多线程程序实现方法的流程图之一;
19.图2是本发明实施例提供的一种多线程程序实现方法的流程图之二;
20.图3是本发明实施例提供的一种多线程程序实现方法的流程图之三;
21.图4是本发明实施例提供的一种多线程程序实现装置的结构图之一;
22.图5是本发明实施例提供的一种多线程程序实现装置的结构图之二;
23.图6是本发明实施例提供的一种多线程程序实现装置的结构图之三;
24.图7是本发明实施例提供的一种多线程程序实现装置的结构图之四;
25.图8是本发明实施例提供的一种通信设备的结构图。
具体实施方式
26.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
27.本发明实施例中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。此外,本技术中使用“和/或”表示所连接对象的至少其中之一,例如a和/或b和/或c,表示包含单独a,单独b,单独c,以及a和b都存在,b和c都存在,a和c都存在,以及a、b和c都存在的7种情况。
28.请参见图1,图1是本发明实施例提供的一种多线程程序实现方法的流程图,如图1所示,包括以下步骤:
29.步骤101、依据目标函数的抽象语法树,获取调用依赖图,调用依赖图包括目标函数的语句之间的依赖关系。
30.其中,目标函数为被开发者标注为开启自动多线程优化功能的函数,在编译时,可以读取代码中的注解,获取目标函数;进一步的,通过java编译器提供的接口,可以获得目标函数函数内部的抽象语法树;进一步的,通过抽象语法树,可以获取包括目标函数的语句之间的依赖关系的调用依赖图。
31.需要说明的是,目标函数包括第一语句和第二语句,在执行第一语句后,紧接着,需要执行第二语句,那么,目标函数的第一语句和第二语句之间的存在依赖关系。
32.另外,调用依赖图的生成可以以有向图为基础,在调用依赖图中,主要包括元素点和边,元素点为目标函数的语句,边为目标函数的语句之间的连接线。
33.步骤102、对调用依赖图进行拆分,获得包括多个线程的线程池。
34.需要说明的是,在获得包括多个线程的线程池之前,需要读取系统的设置,以获取线程池的最大线程数目、默认超时时间、开始拆分线程的最低行数等设置信息。
35.其中,对调用依赖图进行拆分,可以获取包括多个线程的线程池。如图2所示,在该调用依赖图中,“1”、“21”、“22”、“23”、“31”、“32”以及“4”表示目标函数的语句,语句之间的依赖关系通过连接线来表示。对调用依赖图进行拆分,可以获取线程第一线程“1-21-31-4”、第二线程“1-22-31-4”、第三线程“1-22-4”、第四线程“1-22-32-4”和第五线程“1-23-32-4”,上述线程可以构成一个线程池,可以看出第三线程的长度小于其他线程。同时,线程池中线程的数量不能超过线程池的最大线程数目。
36.另外,对元素点较多的调用依赖图,可以通过如下步骤对线程进行拆分:
37.首先,对调用依赖图进行分析,选取图中出度大于1且离起点最近的元素点,记为m元素点,元素点出度大于1表示该元素点对应的语句的结果可能被多个其他语句需求,从而可能需要多线程能力;
38.接着,选取离终点最近的且入度大于1的元素点,记为n元素点,元素点入度大于1表示该元素点可以接收多个不同线程的结果;
39.接着,在调用依赖图中,获取m元素点与n元素点之间的所有路径;
40.接着,从所有路径中任取两条路径,如果两条路径存在相交的点,则将该两条路径标记为同一组。
41.最后,对所有路径进行上述处理后,如果满足路径可以分成多组,且至少两组路径的数量超过线程长度的设定值的要求,那么,通过线程池启用对应数量的线程,将多组路径包含的语句分别按依赖关系的顺序标记线程编号;如果路径组合不能满足上述要求,那么,抛弃调用依赖图中选择的起点元素点和/或终点元素点,选取离起点元素点和/或终点元素点最近的且出度和/或入度大于1的元素点作为新的起点元素点和/或终点元素点,重新进行以上分析处理,直到包括新的起点元素点和/或终点元素点的路径满足上述要求。需要说明的是,如果一条路径中的起点或终点在循环结构或选择结构中,导致在程序执行时,可能经过起点元素点但不一定经过终点元素点,那么跳过这一路径的起点元素点和终点元素点,重新选择其他的路径。
42.步骤103、从线程池中取出长度小于设定值的线程进行组合,获得组合线程。
43.需要说明的是,在对线程进行拆分时,可能存在小部分线程很长,大部分线程都比较短的情况,此时,执行程序时需要启用过多线程。因为大部分线程都比较短,可能挤占线程池中的线程数目,导致其他线程必须等待,启动线程的耗费的时间可能较长,导致程序执行的效率较低。
44.其中,线程的长度设定值可以根据实际的应用场景确定,在此不做限制。在线程池中,将长度小于设定值的短线程取出,此时,线程池中留下的线程都是长度满足要求的长线程。对两个或两个以上的短线程进行组合,可以获得长度满足要求的长线程,如此,可以减少了线程池中短线程的数量。
45.步骤104、在组合线程的长度大于或者等于设定值的情况下,将组合线程添加至线
程池。
46.其中,组合线程的长度大于或者等于设定值,说明组合线程的长度已经符合要求,从线程池中取出来的短线程组合获得的组合线程可以再添加至线程池中。优化后的线程池中的线程的长度满足设定值的要求,在优化后的线程池中执行程序时,可以动态地构建多线程程序。
47.需要说明的是,可以将所有线程编号的语句取出,按线程编号分别放入继承callable接口或runnable接口的内部子类中;在程序执行到相应位置时,可以调用上述内部子类,将带有线程编号的语句放入线程池中执行,从而可以实现动态地构建多线程程序,提高程序的多线程能力。
48.本发明实施例中,依据目标函数的抽象语法树,获取调用依赖图;对调用依赖图进行拆分,获得包括多个线程的线程池;调取多个线程中长度小于设定值的线程进行组合,获得组合线程;在组合线程的长度不小于设定值的情况下,将组合线程放回线程池。通过组合长度较短的线程优化线程的长度,在线程池中执行程序时,可以动态地构建多线程程序,从而可以提高获取多线程程序的效率。
49.作为一种可选的实施方式,依据目标函数的抽象语法树,获取调用依赖图,包括:
50.依据目标函数的抽象语法树,获取目标函数的语句;
51.将目标函数中有依赖关系的语句进行连接,获得调用依赖图。
52.其中,在目标函数的抽象语法树中,可以获得单个语句中使用到的变量和最终赋值的对象。将目标函数的每个语句抽象为有向图上的一个元素点,依据有向图的一般属性,元素点还记录着这个语句依赖的变量名和最终赋值的变量名。如果元素点表示一个对象的方法,则认为调用这一方法的对象既是语句用到的变量,又是最终赋值的变量。另外,可以根据目标函数的语句本身的行号以及语句可能的执行行数粗略地估计这个语句的执行时间,例如,一个基础的算式为1,如果对应一个函数,则该函数的行数为一行。
53.另外,在获取了调用依赖图的元素点的基础上,为调用依赖图创造边。首先,调用依赖图中的第一元素点,第一元素点为调用依赖图中的任一元素点;进一步的,搜索第一元素点为自身依赖的变量赋值的上一个语句对应的目标元素点,在目标函数的抽象语法树中目标元素点对应的目标语句与第一元素点对应的第一语句最为接近;进一步的,连接目标元素点和第一元素点,创建一个从目标元素点到第一元素点的边,调用依赖图中的边可以表示第一语句依赖于目标语句,在程序执行过程中,需要保证先执行目标语句,再执行第一语句。如此,生成了目标函数的调用依赖图。
54.该实施方式中,由于依据目标函数的抽象语法树,获取目标函数的语句,再将目标函数中有依赖关系的语句进行连接,获得目标函数的调用依赖图,目标函数的语句作为调用依赖图的元素点,语句之间的依赖关系作为调用依赖图的边,调用依赖图结构简单,依据调用依赖图获取线程,可以提高获取线程的效率。
55.可选的,从线程池中取出长度小于设定值的线程进行组合,获得组合线程,包括:
56.从线程池中取出长度小于设定值的多个第一线程;
57.将多个第一线程中n个第一线程进行组合,获得组合线程,n个第一线程的执行语句数量少于多个第一线程其余线程的执行语句数量。
58.其中,线程的长度的大小可以表示线程中执行语句的多少,线程池中多个线程长
度小于设定值可能表示线程池有部分线程的长度过短,可能影响程序执行的效率,因此,需要对线程池中的短线程进行组合,以优化线程池。
59.在包括多个线程的线程池中,取出长度小于设定值的多个第一线程,一般而言,为满足线程的组合条件,第一线程的数量大于或等于2;进一步的,将多个第一线程中n个第一线程进行组合,获得组合线程,n为大于等于2的整数。在组合线程的长度满足长度要求的情况下,将组合线程添加至线程池,另外,在只有一个第一线程的长度不满足要求时,没有其他的第一线程与之组合,那么,将该第一线程添加至线程池。以n等于2为例,可以将多个第一线程按线程的执行语句数量从低到高排列,再将执行语句数量少于其他线程的两个线程合并为一个组合线程。
60.该实施方式中,由于从线程池中取出长度小于设定值的多个第一线程,再将多个第一线程中n个第一线程进行组合,获得组合线程,可以提高线程的长度,优化线程池,从而提高获取多线程程序的效率。
61.可选的,多线程程序实现方法还包括:
62.在组合线程的长度小于设定值的情况下,将组合线程更新至多个第一线程中。
63.其中,组合线程的长度小于设定值,表明组合线程中的执行语句的数量太少,仍不满足要求。因此,可以将长度不满足要求的组合线程更新至多个第一线程中,组合线程作为第一线程继续进行线程的组合。在只有一个第一线程的长度不满足要求的情况下,该第一线程没有其他的线程可以与之组合,那么,可以将该第一线程添加至线程池中。
64.该实施方式中,由于在组合线程的长度小于设定值的情况下,将组合线程更新至多个第一线程中,该组合线程可以作为第一线程继续进行线程的组合,可以保证线程池中符合长度要求的线程的比例,可以优化线程池,从而提高获取多线程程序的效率。
65.一种具体的实施方式,如图3所示,优化线程池的步骤如下:
66.步骤1、读取设置。读取系统的设置,以获取线程池的最大线程数目、默认超时时间、开始拆分线程的最低行数等设置信息。
67.步骤2、读取java编译器语法树。通过java编译器提供的接口,可以获得被开发者标注为开启自动多线程优化功能的目标函数函数内部的抽象语法树。
68.步骤3、生成调用依赖图。通过目标函数函数的抽象语法树,可以获取包括目标函数的语句之间的依赖关系的调用依赖图。调用依赖图的生成可以以有向图为基础,在调用依赖图中,主要包括元素点和边,元素点为目标函数的语句,边为目标函数的语句之间的连接线。
69.步骤4、对调用依赖图进行拆分。该步骤包括:步骤4.1、获取图中最接近起点的入度大于1的点作为路径起点和获取图中最接近起终点的出度大于1的点作为路径终点;步骤4.2、获取起点到终点的所有路径;步骤4.3、分组,如有交点则将两组合并,即如果第一路径和第二路径有相同的元素点,那么,将第一路径和第二路径合并为一组;步骤4.4、判断是否满足剩余组数大于1,且组长度足够的条件;步骤4.5、在不满足剩余组数大于1,且组长度足够的条件的情况下,排除这对起点和终点,另取一对相对距离次远的路径起点和终点,即抛弃在调用依赖图中一开始选择的起点元素点和/或终点元素点,寻找离起点元素点和/或终点元素点更远一点的出度和/或入度大于1的元素点作为新的起点元素点和/或终点元素点;在满足剩余组数大于1,且组长度足够的条件的情况下,执行步骤5。
70.步骤5、将这些组中的函数按照原来的行号顺序分别写入线程临时类。
71.步骤6、按照从短到长的顺序将线程排序,然后依次合并线程直到符合要求。在线程池中多个线程的长度不满足要求的情况下,对多个线程按从短到长的顺序排序,依次合并线程,以满足所有线程的长度大于或等于设定值,或只有一个线程的长度小于设定值。
72.请参见图4,图4是本发明实施例提供的一种多线程程序实现装置的结构图之一,如图4所示,多线程程序实现装置400包括:
73.获取模块401,用于依据目标函数的抽象语法树,获取调用依赖图,调用依赖图包括目标函数的语句之间的依赖关系;
74.拆分模块402,用于对调用依赖图进行拆分,获得包括多个线程的线程池;
75.组合模块403,用于从线程池中取出长度小于设定值的线程进行组合,获得组合线程;
76.添加模块404,用于在组合线程的长度大于或者等于设定值的情况下,将组合线程添加至线程池。
77.可选的,如图5所示,获取模块401包括:
78.获取子模块4011,用于依据目标函数的抽象语法树,获取目标函数的语句;
79.连接子模块4012,用于将目标函数中有依赖关系的语句进行连接,获得调用依赖图。
80.可选的,如图6所示,组合模块403包括:
81.取出子模块4031,用于从线程池中取出长度小于设定值的多个第一线程;
82.组合子模块4032,用于将多个第一线程中n个第一线程进行组合,获得组合线程,n个第一线程的执行语句数量少于多个第一线程其余线程的执行语句数量。
83.可选的,如图7所示,组合模块403还包括:
84.更新子模块4033,用于在组合线程的长度小于设定值的情况下,将组合线程更新至多个第一线程中。
85.多线程程序实现装置400能够实现本发明实施例中图1方法实施例的各个过程,以及达到相同的有益效果,为避免重复,这里不再赘述。
86.本发明实施例还提供一种通信设备。请参见图8,通信设备可以包括处理器801、存储器802及存储在存储器802上并可在处理器801上运行的程序8021,程序8021被处理器801执行时可实现图1对应的方法实施例中的任意步骤及达到相同的有益效果,此处不再赘述。
87.本领域普通技术人员可以理解实现上述实施例方法的全部或者部分步骤是可以通过程序指令相关的硬件来完成,所述的程序可以存储于一可读取介质中。本发明实施例还提供一种可读存储介质,所述可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时可实现上述图1对应的方法实施例中的任意步骤,且能达到相同的技术效果,为避免重复,这里不再赘述。
88.所述的存储介质,如只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等。
89.以上所述是本发明实施例的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1