CN106681811A - 基于线程池的多线程调度方法及装置 - Google Patents
基于线程池的多线程调度方法及装置 Download PDFInfo
- Publication number
- CN106681811A CN106681811A CN201611122099.8A CN201611122099A CN106681811A CN 106681811 A CN106681811 A CN 106681811A CN 201611122099 A CN201611122099 A CN 201611122099A CN 106681811 A CN106681811 A CN 106681811A
- Authority
- CN
- China
- Prior art keywords
- lock
- task object
- thread
- countdown
- goal task
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种基于线程池的多线程调度方法,包括:检测线程池的线程调度函数的调用过程,获取调用过程对应的调用堆栈的堆栈特征信息和目标任务对象;检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,计数锁在与目标任务对象对应的线程数大于或等于该计数锁的阈值时释放,倒计时锁在等待预设时长后释放;在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数;在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。采用本发明,可提高程序崩溃的复现率。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种基于线程池的多线程调度方法及装置。
背景技术
随着通信互联网技术的发展,各种应用程序在用户生活中应用越来越广泛,且用户对应用程序的性能的要求也越来越高。其中,稳定性是衡量一个应用程序性能的重要性指标,并且,应用程序的稳定性在一定程度上决定了应用程序的留存率和口碑的好坏,因此,提升应用程序的稳定性对于应用程序的发展有着十分重要的意义。在应用程序的开发和使用过程中,会针对应用程序在运行的过程中出现的程序崩溃(Crash)进行分析和复现,确定触发Crash的具体原因,并基于该原因进行修正,以提高应用程序在运行过程中的稳定性。
在对应用程序进行调试的过程中,可以查看当前的函数调用栈;例如,在相关技术中,在出现程序崩溃(Crash)时可以上报发生程序崩溃时的函数调用栈,程序开发可以根据上报的函数调用栈内容来确定发生崩溃的原因。但是,因为在现有的终端上很多Crash是由于多线程争抢资源导致的,而在Android***中,通过线程池ThreadPoolExecutor对线程进行调度和管理的过程中,不是直接调用start方法,而是通过线程池来确定每一个线程的启动时间,也就是说,线程的启动时机不是由开发者决定的,带有不确定性,例如,会受到线程池的大小、线程缓存队列等相关因素的影响,这就导致了在复现Crash的过程中,开发者无法确定每一个线程的具体的启动时间,无法复现之前上报的Crash发生时的每一个线程的具体的启动时间,无法还原在程序调试或者用户使用时的具体的使用场景,无法获知触发Crash的真正原因。
也就是说,在上述相关技术中,存在在发生Crash时无法准确定位发生Crash的问题。
发明内容
基于此,为解决传统技术中的定位程序发生崩溃(Crash)发生的原因时存在的复现率不足的技术问题,特提出了一种基于线程池的多线程调度方法。
一种基于线程池的多线程调度方法,包括:
检测线程池的线程调度函数的调用过程,获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象,所述目标任务对象为实现了线程接口的对象;
检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,所述计数锁在与目标任务对象对应的线程数大于或等于所述计数锁的阈值时释放,所述倒计时锁在等待预设时长后释放;
在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数;
在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。
可选的,在其中一个实施例中,所述获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象包括:通过钩子函数获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
可选的,在其中一个实施例中,所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁还包括:通过钩子函数为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁。
可选的,在其中一个实施例中,所述检测调用所述目标任务对象的运行函数还包括:
通过与所述目标任务对象的运行函数对应的钩子函数获取所述目标任务对象的类名;
判断所述类名是否为预设的待测应用的类名,若是,则执行所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在其中一个实施例中,所述获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象之后还包括:获取所述目标任务对象的哈希码,将所述哈希码与所述堆栈特征信息对应存储在缓存中;
所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁还包括:查找与所述目标任务对象的哈希码对应的堆栈特征信息,获取与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在其中一个实施例中,所述方法还包括:在所述计数锁或所述倒计时锁的锁定状态释放后,将所述目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息从所述缓存中移除。
此外,为解决传统技术中的定位程序发生崩溃(Crash)发生的原因时存在的复现率不足的技术问题,特提出了一种基于线程池的多线程调度装置。
一种基于线程池的多线程调度装置,包括:
线程调度函数调用模块,用于检测线程池的线程调度函数的调用过程,获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象,所述目标任务对象为实现了线程接口的对象;
同步锁添加模块,用于检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,所述计数锁在与目标任务对象对应的线程数大于或等于所述计数锁的阈值时释放,所述倒计时锁在等待预设时长后释放;
暂停执行模块,用于在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数;
运行函数执行模块,用于在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。
可选的,在其中一个实施例中,所述线程调度函数调用模块还用于通过钩子函数获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
可选的,在其中一个实施例中,所述同步锁添加模块还用于通过钩子函数为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁。
可选的,在其中一个实施例中,所述同步锁添加模块还用于通过与所述目标任务对象的运行函数对应的钩子函数获取所述目标任务对象的类名;判断所述类名是否为预设的待测应用的类名,在所述类名为所述预设的待测应用的类名时,执行所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在其中一个实施例中,所述装置还包括哈希码对应存储模块,用于获取所述目标任务对象的哈希码,将所述哈希码与所述堆栈特征信息对应存储在缓存中;所述同步锁添加模块还用于查找与所述目标任务对象的哈希码对应的堆栈特征信息,获取与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在其中一个实施例中,所述装置还包括哈希码存储移除模块,用于在所述计数锁或所述倒计时锁的锁定状态释放后,将所述目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息从所述缓存中移除。
实施本发明实施例,将具有如下有益效果:
采用了上述基于线程池的多线程调度方法和装置之后,在线程池中调用线程调度函数时,获取调用线程调度函数对应的目标任务对象以及调用堆栈,然后在检测到调用该目标任务对象的运行函数时,获取与上述调用堆栈对应的计数锁和/或倒计时锁并将计数锁和/或倒计时锁添加上述检测到的运行函数上,以使得调用该运行函数的线程暂停执行,并且上述线程的执行会在上述添加在该运行函数上的计数锁和/或倒计时锁被释放之后同步执行,并且,锁会在因为添加计数锁而暂停执行的线程请求数量达到阈值时释放或者在相应的线程等待时长超过预设时长时释放。也就是说,因为Runnable对象的run方法被加锁而暂停执行的线程会在该锁释放之后同步执行,相当于控制了相关线程的执行时机;这就使得在复现Crash的过程中,因为可以使得调用目标任务对象和相应的调用堆栈的线程同时执行,模拟在实际的使用场景中线程池中的多个线程同时争抢资源的应用场景,相对于相关技术中只能通过控制线程池的线程数量来控制同时执行的线程数量的方案来讲,提高了在实际的使用场景中因为多个线程同时争抢资源导致的程序崩溃再次出现的概率,从而提高了因为多线程争抢资源而导致的***崩溃的概率,这样就使的程序测试中能够更加快速地找到程序崩溃并帮助测试人员分析其原因,提高了程序测试的效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
其中:
图1为一个实施例中线程池的线程调度过程示意图;
图2为一个实施例中一种基于线程池的多线程调度方法的流程示意图;
图3为一个实施例中一种基于线程池的多线程调度方法的流程示意图;
图4为一个实施例中一种基于线程池的多线程调度装置的结构示意图;
图5为一个实施例中运行前述基于线程池的多线程调度方法的计算机设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为解决传统技术中的定位程序发生程序崩溃(Crash)发生的原因时存在的复现率不足的技术问题,在本实施例中,特提出了一种基于线程池的多线程调度方法,该方法的实现可依赖于计算机程序,该计算机程序可运行于基于冯诺依曼体系的计算机***之上,该计算机程序可以是应用开发测试过程中的线程调度程序。该计算机***可以是运行上述计算机程序的例如智能手机、平板电脑、个人电脑等服务器或终端。
在本实施例中,程序崩溃(Crash)指的是在计算机***压力或性能测试过程中,因为某种原因出现宕机,或主机、程序停止工作、停止响应、进程中断等情况,如程序崩溃等。而在多线程运行环境中,由于线程竞争访问资源时的不确定性,因此更容易导致程序发生崩溃。在应用程序的开发测试中程序的运行出现Crash,会将该Crash以及出现Crash时当前的函数调用堆栈等相关数据上报给相应的平台或者服务器,或者,在用户使用该应用程序时出现Crash也会将该Crash以及出现Crash时当前的函数调用堆栈等相关数据上报给相应的平台或服务器,由该平台或者服务器对相应的Crash进行分析,并重新发生Crash时的使用场景,从而确定触发Crash的真正原因,并针对该原因进行调试和修正。
在本实施例中,下述基于线程池的多线程调度方法就是为了实现用户使用或者开发人员在程序调试的过程中的线程调度的具体场景与在出现Crash后开发人员在重现该Crash出现的应用场景时的线程调度的具体场景是一致的,也就是说,提高复现Crash的概率。
需要说明的是,在本实施例中,上述基于线程池的多线程调度方法可基于Android***的计算机终端,并且,在该终端中,线程的处理过程是通过线程池来完成的,例如,Android***中自带的线程池ThreadPoolExecutor,即,所有的线程的启动是通过ThreadPoolExecutor.execute(Runnable实例)传入,其中Runnable实例为实现Runnable接口的对象,线程池可对其中的线程进行集体管理和调度,用户可以自动或手动的设置线程池中线程数量的大小,以控制运行的线程数量,从而避免了***拥挤或者***资源的浪费。
例如,在图1所示的线程池的线程调度的示意图中,任务对象的创建是通过ThreadPoolExecutor.execute(Runnable实例)实现的,然后将该Runnable实例对应的任务添加到线程池中;在将该Runnable实例对应的任务添加到线程池的过程中,由线程池根据与该线程池对应的corePoolSize(即线程池维护线程的最少数量)、缓冲队列、以及maximumPoolSize(即线程池维护线程的最大数量)来确定该任务的执行策略。具体的,如果线程池中的数量小于corePoolSize,创建新的线程来处理被添加的任务;如果线程池中的数量大于或等于corePoolSize,但是缓冲队列未满,那么任务被放入缓冲队列;如果线程池中的数量大于corePoolSize,缓冲队列满,并且线程池中的数量小于maximumPoolSize,创建新的线程来处理被添加的任务;如果线程池中的数量大于corePoolSize,缓冲队列满,并且线程池中的数量等于maximumPoolSize,那么通过handler(线程池对拒绝任务的处理策略)所指定的策略来处理此任务。也就是说,添加到线程池的线程的具体执行时机不是由用户来控制的,而是由线程池根据线程池中当前存在的线程数量来进行调度的。
需要说明的是,上述方法的执行也可依赖于其他的用户自定义编写的或者第三方开发团队编写的线程池组件,并且上述方法的执行也不限于Android***,也可应用于ios、windows等其他具有线程机制的操作***中。
具体的,如图2所示,上述基于线程池的多线程调度方法包括如下步骤S102-S108:
步骤S102:检测线程池的线程调度函数的调用过程,获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象,所述目标任务对象为实现了线程接口的对象。
在线程池的多线程环境下,当有新的任务需要处理时,则需要调用线程池的线程调度函数来将该需要处理的新的任务添加到线程池中由线程池进行调度。在本实施例中,在Android***的线程池ThreadPoolExecutor下,线程调度函数即为***类ThreadPoolExecutor的execute方法,即ThreadPoolExecutor.execute;也就是说,线程调度函数指的是将例如Runnable实例的任务对象添加到线程池中由线程池进行进一步的调度的函数,并且,该由线程池的线程调度函数添加到线程池的新的任务或任务对象即为该线程池的线程调度函数所对应的目标任务对象。
在本实施例中,在检测到线程池的线程调度函数被调用时,获取在调用该线程调度函数时对应的调用堆栈,并且,还获取该调用过程中线程调度函数的对象参数,即目标任务对象(即通过该execute方法的传入Runnable实例)。在本实施例中,上述目标任务对象为实现了Runnable线程接口的任务对象,即Runnable实例。一个Runnable实例可通过继承Thread类或ThreadPoolExecutor类生成多个任务对象。
具体的,在调用ThreadPoolExecutor的execute方法时,具体的格式为ThreadPoolExecutor.execute(Runnable实例),即为根据一个实现了Runnable接口的任务对象创建一个相应的任务对象异步执行该Runnable实例的run方法。当多次调用ThreadPoolExecutor.execute(Runnable实例)时,则创建了多个任务对象异步执行该Runnable实例的run方法;且该多个任务对象的堆栈特征信息相同。
需要说明的是,在本实施例中,调用堆栈的堆栈特征信息指的是该任务对象中对应的函数调用关系在内存中占用的堆栈所对应的特征信息,并且,该特征信息可以是序列化的序列码,用来唯一标识当前的调用堆栈,并且,不同的调用堆栈的堆栈特征信息是不同的,根据堆栈特征信息可以唯一确定相应的调用堆栈。也就是说,在后续的操作中,添加在目标任务对象的运行函数上与堆栈特征信息对应的计数锁和/或倒计时锁中,就是根据堆栈特征信息来区分不同的调用堆栈以及不同的计数锁和/或倒计时锁。
进一步的,在本实施例中,上述检测线程池的线程调度函数的调用过程以及获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象的过程中,可以使用钩子函数来实现对线程调度函数的监控以及调用过程中堆栈特征信息以及目标任务对象的获取,具体的,所述获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象包括:通过钩子函数获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
钩子函数(hook)是***消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定函数的行为动作,而且所监视的指定函数可以是其他线程所创建的,在执行处理该指定函数之前可以先处理线程信息。另外,Hook机制允许应用程序截获处理Window消息或特定事件,钩子实际上是一个处理消息的程序段,通过***调用,将Hook函数挂入***,在执行卸载键盘布局之前,Hook函数就先捕获线程信息,进而Hook函数可以加工处理该线程信息,也可以不作处理而继续传递该线程信息,还可以强制结束该线程信息的传递。
具体实施中,hook某个函数就是在运行时在这个函数的执行前或执行后添加一些可执行代码,在运行时执行该函数时,也同样执行这些添加的可执行代码。例如,在本实施例中,通过钩子函数获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象,即为在该线程调度函数的执行前添加实现获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象功能的可执行代码。
具体实施中,在相应的线程调度函数之前预先添加hook获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象的相关的可执行代码,从而在调用线程池的线程调度函数时,通过执行上述预先添加hook获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象的相关代码来获取线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
可选的,还可以对上述线程池的线程调度函数进行hook以监控线程池是否调用相应的线程调度函数来将新的任务对象添加到线程池中。需要说明的是,在本实施例中,该新的任务对象可以是已有的任务对象,通过线程调度函数添加到线程池中;也可以是新创建的任务对象,即创建新的任务对象并该该新的任务对象添加到线程池中由线程池进行管理。具体的,在线程调度函数之前添加对线程调度函数进行hook的相关代码,在发生线程池的线程调度函数的调用时,通过执行添加的对线程调度函数进行hook的相关代码来铺货相关的线程调度信息。
步骤S104:检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,所述计数锁在与目标任务对象对应的线程数大于或等于所述计数锁的阈值时释放,所述倒计时锁在等待预设时长后释放。
步骤S106:在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数。
步骤S108:在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。
在本实施例中,在调用目标任务对象Runnable实例时,可以通过调用运行函数run方法来实现。一般情况下,在线程池中调用了某一个Runnable实例的run方法之后,该Runnable实例的run方法对应的线程会进入到线程池中进行集中管理,例如,在线程池中的线程数量小于该线程池的corePoolSize时,直接执行该线程,在线程池中的线程数量大于或等于该线程池的corePoolSize时,会将该线程添加到相应的缓冲队列中进行排队等候。
在本实施例中,为了控制该目标任务对象Runnable实例的运行函数run方法对应的线程的执行时间,会在该run方法之前添加相应的计数锁或者倒计时锁,在添加在该run方法之前的计数锁或者倒计时锁被锁定的情况下,该调用Runnable实例的run方法的线程会暂停执行或中止执行,直至添加在该run方法之前的计数锁或倒计时锁的锁定状态被释放之后才会继续执行。
需要说明的是,在本实施例中,添加在调用目标线程对应的运行函数上的计数锁或者倒计时锁是与该目标任务对象Runnable实例对应的堆栈特征信息对应的,也就是说,与步骤S102中线程池的线程调度函数的调用过程中对应的堆栈特征信息是对应的。相同的堆栈特征信息所对应的目标线程对应的运行函数run方法上所加上的锁是相同的,并且,在该锁被释放时,加上同一个锁的运行函数run方法所对应的线程会同时进入到相应的线程执行程序中。
具体的,添加在调用目标任务对象Runnable实例的运行函数run方法上的计数锁还包括了与该计数锁对应的阈值,该阈值用来限制添加该计数锁的运行函数run方法所对应的最大线程数量,也就是说,在添加了该计数锁的调用目标线程对应的运行函run方法数所对应的线程数量超过上述阈值时,该计数锁被释放。
当多次调用该Runnable实例的run方法的时候,每次调用一次,就会增加一个线程,而这个线程对该Runnable实例的run方法的调用就会由于计数锁的锁定而被暂停,但会增加计数锁的计数,当计数锁的计数达到或超过阈值时,则将该锁释放。
例如,该计数锁对应的阈值为5,则说明该计数锁所对应的最大线程数量为5,在伴随着待测应用针对同一Runnable实例调用run方法的次数增加,使得计数锁中的计数也随之增加,当该计数锁所对应的调用同一Runnable实例的run方法的线程数量达到5时,该计数锁被释放。也就是说,被暂停或者中止执行的线程将会在计数锁释放后同步执行,从而模拟出5个线程同步执行的应用场景。
进一步的,添加在调用Runnable实例的run方法上的倒计时锁中还携带有与该倒计时锁对应的预设时长,该预设时长用来限制被改倒计时锁所暂停或中止执行的线程的最长的等待时长,并且,该等待时长是从添加该倒计时锁的run方法所对应的最早被暂停或中止执行的线程所对应的等待时长。在被添加了倒计时锁的调用Runnable实例的run方法对应的等待时长超过该预设时长时,该倒计时锁被释放。
需要说明的是,在本实施例中,添加在调用Runnable实例的run方法上的计数锁和倒计时锁可以是同时作用于Runnable实例的run方法上的,并且,在具体执行过程中,只需要其中一个锁的释放条件被满足,即执行相应的run方法对应的线程。在本实施例中,可以将计数锁和倒计时锁统称为同步锁,该同步锁可以是具备计数功能的锁,也可以是具备倒计时功能的锁,还可以是同时具备计数和倒计时功能的锁。在同时具备计数和倒计时功能时,可以避免被暂停执行的线程数超过一定的数量,在后续锁被释放之后的执行过程中造成拥堵,也可以避免调用目标任务对象或调用堆栈的线程数量达不到计数器的阈值导致锁迟迟不能被释放的现象。在具体操作中,只需要满足计数或倒计时功能中的一个释放条件即可释放相应的同步锁,即只需要满足与该同步锁对应的线程请求数量超过预设的阈值以及该同步锁的等待时长超过预设的时长这两个释放条件中的一个条件,相应的同步锁即被释放,因为该同步锁被暂停或中止执行的线程即可继续执行。
具体实施中,上述添加在调用目标任务对象的运行函数上的计数锁或者倒计时锁可以通过hook实现,具体的,所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁之前还包括:通过钩子函数为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁。
通过hook在该运行函数run方法之前添加与计数锁和/或倒计时锁对应的相关代码,从而在该run方法之前加上计数锁和/或倒计时锁,并且,在后续的调用该run方法时,通过该计数锁和倒计时锁来控制相应的线程的执行时间。
需要说明的是,在另一个实施例中,添加在所述目标任务对象的运行函数上的与所述堆栈特征信息对应的计数锁和/或倒计时锁还可以预添加的,也就是说,预先在相应的运行函数上添加了相应的计数锁或者倒计时锁,并且,在步骤S104中,通过hook来执行相应的添加计数锁或者倒计时锁的代码。
具体的,在上述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁以及通过钩子函数为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁的步骤中,若相应的运行函数在此之前并没有添加过计数锁和/或倒计时锁,则执行上述通过钩子函数为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁的步骤;若该运行函数再次之前添加过与堆栈特征信息对应的计数锁和/或倒计时锁,则不需要再次添加锁,直接执行上述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁的步骤即可。
进一步的,在本实施例中,并不是线程池的线程调度函数所对应的所有的目标任务对象的运行函数均会被添加计数锁或倒计时锁,还需要判断相应的调用的目标任务对象是否预设待测的范围,例如,是否属于待测应用的范围之内。
具体的,所述检测调用所述目标任务对象的运行函数还包括:通过与所述目标任务对象的运行函数对应的钩子函数获取所述目标任务对象的类名;判断所述类名是否为预设的待测应用的类名,若是,则执行所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁。
也就是说,在检测调用Runnable实例的run方法时,还获取该Runnable实例对应的类名,并且判断该类名是否为预设的待测应用的类名,并且,只有在该类名为预设的待测应用的类名时,才执行所述在所述Runnable实例的run函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁的步骤,也就是说,若检测到的某一个run方法所调用的Runnable实例所对应的类不属于预设的待测应用的类,则不需要对该run方法执行添加锁的步骤,直接执行相应的线程即可。这就使得不在考虑范围或者不在测试范围之内的任务对象对应的线程会由线程池进行管理和调度,不需要使用计数锁或者倒计时锁来对其进行执行时机的限定。
如前所述,在本实施例中,在对运行函数添加计数锁或者倒计时锁的过程中,是根据该运行函数run方法所调用的目标人物对象Runnable实例在线程调度函数中对应的调用堆栈的堆栈特征信息来确定的,也就是说,目标任务对象Runnable实例、堆栈特征信息以及计数锁或倒计时锁之间是对应的。在本实施例中,为了避免在加锁的过程中所添加的计数锁或者倒计时锁为其他调用堆栈的,从而影响在后续的线程调度中的理想效果,在对run方法加锁之前,还需要确定与该run方法对应的锁,即确定对应的调用堆栈的堆栈特征信息所对应的锁。
具体的,所述获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象之后还包括:获取所述目标任务对象的哈希码,将所述哈希码与所述堆栈特征信息对应存储在缓存中;所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁还包括:查找与所述目标任务对象的哈希码对应的堆栈特征信息,获取与所述堆栈特征信息对应的计数锁和/或倒计时锁。
在线程池的线程调度函数的调用过程中,在确定了该调用过程对应的堆栈特征信息以及所调用的目标任务对象之后,还需要获取该Runnable实例的哈希码hashcode,并且,建立该Runnable实例的hashcode与该调用堆栈的堆栈特征信息之间的对应关系,然后将该Runnable实例的hashcode与该调用堆栈的堆栈特征信息之间的对应关系存储在缓存中。在后续的流程中,可以通过在缓存中查找与当前的Runnable实例对应存储的堆栈特征信息来确定与该Runnable实例e对应的调用堆栈。
需要说明的是,在上述将哈希码以及相应的堆栈特征信息对应存储在缓存中的过程可以是将Runnable实例的hashcode以及相应的调用堆栈的堆栈特征信息对应存储在映射对象容器(即map)中,例如,在一个实施例中,上述过程可以是通过executorAppLineAndClasshashCodeMap(hashcode,堆栈特征)建立在映射对象容器中Runnable实例的hashcode以及相应的调用堆栈的堆栈特征信息的映射关系,在已知某一个Runnable实例的hashcode时,可以通过查找该映射对象容器确定与该Runnable实例的hashcode对应的堆栈特征信息,然后根据该堆栈特征信息来确定需要添加在该Runnable实例的run方法上的计数锁或者倒计时锁。
进一步的,在将Runnable实例的hashcode与堆栈特征信息对应存储之后,在在所述Runnable实例的run函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁的过程中,在对应存储的存储区域中查找与该Runnable实例的hashcode对应的堆栈特征信息,然后通过该堆栈特征信息来确定与之对应的计数锁和/或倒计时锁。
在另一个可选的实施例中,在获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象的步骤之后,在检测调用所述目标任务对象的运行函数的步骤之前,上述方法还包括:获取所述目标任务对象的类名,确定该类名在预设的待测应用的类名中,然后执行所述获取所述目标任务对象的哈希码、将所述哈希码与所述堆栈特征信息对应存储在缓存中的步骤。
可选的,在一个实施例中,将目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息对应存储是为了在后续的添加计数锁和倒计时锁的过程中确定应该添加的锁,在该锁被释放之后,目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息之间的对应关系不再需要,因此,在计数锁或倒计时锁被释放之后,与该锁对应的目标任务对象的哈希码以及对应存储的堆栈特征信息可以从缓存中删除,以节省缓存资源。
具体的,所述方法还包括:在所述计数锁或所述倒计时锁的锁定状态释放后,将所述目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息从所述缓存中移除。
也就是说,在检测到计数锁或者倒计时锁被释放之后,从存储哈希码hashcode与堆栈特征信息的对应关系的缓存中删除与释放的锁对应的相关对应存储的数据。
可选的,在一个实施例中,如图3所示,图3展示了一种基于线程池的多线程调度方法的流程示意图,在图3所示的应用场景中,通过钩子函数检测线程池的线程调度函数的调用过程,然后获取该调用过程对应的调用堆栈,并且在该调用堆栈包括预设的待测应用的类名时,获取上述调用过程的目标任务对象(Runnable实例)以及该Runnable实例的哈希码。然后通过提起待测应用的调用行,来确定调用堆栈对应的堆栈特征信息,并将该堆栈特征信息与上述哈希码对应存储在缓存中。进一步的,获取上述Runnable实例的类名,并且在该类名属于钩子函数的监控对象时,通过钩子函数来检测调用上述Runnable实例的run方法,并获取检测到的run方法对应的Runnable实例的哈希码,在根据获取到的哈希码在缓存中存储的哈希码与堆栈特征信息的对应关系中查找与该哈希码对应的堆栈特征信息,并使用该查找到的堆栈特征信息对上述run方法进行加锁(计数锁和/或倒计时锁)来暂停相应的run方法的执行;在检测到计数锁或倒计时锁对应的释放条件时,释放该锁并执行因为上述run方法。
采用了上述实施例,在线程池中调用线程调度函数时,获取调用线程调度函数对应的目标任务对象以及调用堆栈,若调用堆栈或者目标对象所在的类包括了待测应用对应的类型,则在检测到调用该目标任务对象的运行函数时,获取与上述调用堆栈对应的计数锁和/或倒计时锁并将计数锁和/或倒计时锁添加上述检测到的运行函数上,以使得调用该运行函数的线程暂停执行,并且上述线程的执行会在上述添加在该运行函数上的计数锁和/或倒计时锁被释放之后同步执行,并且,锁会在因为添加计数锁而暂停执行的线程请求数量达到阈值时释放或者在相应的线程等待时长超过预设时长时释放。也就是说,因为Runnable对象的run方法被加锁而暂停执行的线程会在该锁释放之后同步执行,相当于控制了相关线程的执行时机;这就使得在复现Crash的过程中,因为可以使得调用目标任务对象和相应的调用堆栈的线程同时执行,模拟在实际的使用场景中线程池中的多个线程同时争抢资源的应用场景,相对于相关技术中只能通过控制线程池的线程数量来控制同时执行的线程数量的方案来讲,提高了在实际的使用场景中因为多个线程同时争抢资源导致的程序崩溃再次出现的概率,从而提高了因为多线程争抢资源而导致的***崩溃的概率,这样就使的程序测试中能够更加快速地找到程序崩溃并帮助测试人员分析其原因,提高了程序测试的效率。
此外,为解决传统技术中的定位程序发生程序崩溃(Crash)发生的原因时存在的复现率不足的技术问题,在一个实施例中,如图4所示,还提出了一种基于线程池的多线程调度装置,包括线程调度函数调用模块102、同步锁添加模块104、暂停执行模块106以及运行函数执行模块108,其中:
线程调度函数调用模块102,用于检测线程池的线程调度函数的调用过程,获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象,所述目标任务对象为实现了线程接口的对象;
同步锁添加模块104,用于检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,所述计数锁在与目标任务对象对应的线程数大于或等于所述计数锁的阈值时释放,所述倒计时锁在等待预设时长后释放;
暂停执行模块106,用于在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数;
运行函数执行模块108,用于在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。
可选的,在一个实施例中,所述线程调度函数调用模块102还用于通过hook获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
可选的,在一个实施例中,所述同步锁添加模块104还用于通过hook为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁。
可选的,在一个实施例中,所述同步锁添加模块104还用于通过与所述目标任务对象的运行函数对应的hook获取所述目标任务对象的类名;判断所述类名是否为预设的待测应用的类名,在所述类名为所述预设的待测应用的类名时,执行所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在一个实施例中,如图4所示,上述装置还包括哈希码对应存储模块110,用于获取所述目标任务对象的哈希码,将所述哈希码与所述堆栈特征信息对应存储在缓存中;所述同步锁添加模块104还用于查找与所述目标任务对象的哈希码对应的堆栈特征信息,获取与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在一个实施例中,如图4所示,上述装置还包括哈希码存储移除模块112,用于在所述计数锁或所述倒计时锁的锁定状态释放后,将所述目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息从所述缓存中移除。
实施本发明实施例,将具有如下有益效果:
采用了上述基于线程池的多线程调度方法和装置之后,在线程池中调用线程调度函数时,获取调用线程调度函数对应的目标任务对象以及调用堆栈,然后在检测到调用该目标任务对象的运行函数时,获取与上述调用堆栈对应的计数锁和/或倒计时锁并将计数锁和/或倒计时锁添加上述检测到的运行函数上,以使得调用该运行函数的线程暂停执行,并且上述线程的执行会在上述添加在该运行函数上的计数锁和/或倒计时锁被释放之后同步执行,并且,锁会在因为添加计数锁而暂停执行的线程请求数量达到阈值时释放或者在相应的线程等待时长超过预设时长时释放。也就是说,因为Runnable对象的run方法被加锁而暂停执行的线程会在该锁释放之后同步执行,相当于控制了相关线程的执行时机;这就使得在复现Crash的过程中,因为可以使得调用目标任务对象和相应的调用堆栈的线程同时执行,模拟在实际的使用场景中线程池中的多个线程同时争抢资源的应用场景,相对于相关技术中只能通过控制线程池的线程数量来控制同时执行的线程数量的方案来讲,提高了在实际的使用场景中因为多个线程同时争抢资源导致的程序崩溃再次出现的概率,从而提高了因为多线程争抢资源而导致的***崩溃的概率,这样就使的程序测试中能够更加快速地找到程序崩溃并帮助测试人员分析其原因,提高了程序测试的效率。
在一个实施例中,如图5所示,图5展示了一种运行上述基于线程池的多线程调度方法的基于冯诺依曼体系的计算机***的终端。该计算机***可以是智能手机、平板电脑、掌上电脑、笔记本电脑或个人电脑等终端设备。具体的,可包括通过***总线连接的外部输入接口1001、处理器1002、存储器1003和输出接口1004。其中,外部输入接口1001可选的可至少包括网络接口10012。存储器1003可包括外存储器10032(例如硬盘、光盘或软盘等)和内存储器10034。输出接口1004可至少包括显示屏10042等设备。
在本实施例中,本方法的运行基于计算机程序,该计算机程序的程序文件存储于前述基于冯诺依曼体系的计算机***的外存储器10032中,在运行时被加载到内存储器10034中,然后被编译为机器码之后传递至处理器1002中执行,从而使得基于冯诺依曼体系的计算机***中形成逻辑上的线程调度函数调用模块102、同步锁添加模块104、暂停执行模块106、运行函数执行模块108、哈希码对应存储模块110以及哈希码存储移除模块112。且在上述基于线程池的多线程调度方法执行过程中,输入的参数均通过外部输入接口1001接收,并传递至存储器1003中缓存,然后输入到处理器1002中进行处理,处理的结果数据或缓存于存储器1003中进行后续地处理,或被传递至输出接口1004进行输出。
具体的,处理器1002用来执行以下操作:
检测线程池的线程调度函数的调用过程,获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象,所述目标任务对象为实现了线程接口的对象;
检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,所述计数锁在与目标任务对象对应的线程数大于或等于所述计数锁的阈值时释放,所述倒计时锁在等待预设时长后释放;
在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数;
在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。
可选的,在一个实施例中,处理器1002还用来执行如下操作:
通过钩子函数获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
可选的,在一个实施例中,处理器1002还用来执行如下操作:
通过钩子函数为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁。
可选的,在一个实施例中,处理器1002还用来执行如下操作:
通过与所述目标任务对象的运行函数对应的钩子函数获取所述目标任务对象的类名;判断所述类名是否为预设的待测应用的类名,若是,则执行所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在一个实施例中,处理器1002还用来执行如下操作:
获取所述目标任务对象的哈希码,将所述哈希码与所述堆栈特征信息对应存储在缓存中;
所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁还包括:
查找与所述目标任务对象的哈希码对应的堆栈特征信息,获取与所述堆栈特征信息对应的计数锁和/或倒计时锁。
可选的,在一个实施例中,处理器1002还用来执行如下操作:
在所述计数锁或所述倒计时锁的锁定状态释放后,将所述目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息从所述缓存中移除。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (12)
1.一种基于线程池的多线程调度方法,其特征在于,包括:
检测线程池的线程调度函数的调用过程,获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象,所述目标任务对象为实现了线程接口的对象;
检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,所述计数锁在与目标任务对象对应的线程数大于或等于所述计数锁的阈值时释放,所述倒计时锁在等待预设时长后释放;
在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数;
在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。
2.根据权利要求1所述的基于线程池的多线程调度方法,其特征在于,所述获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象包括:
通过钩子函数获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
3.根据权利要求1所述的基于线程池的多线程调度方法,其特征在于,所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁还包括:
通过钩子函数为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁。
4.根据权利要求3所述的基于线程池的多线程调度方法,其特征在于,所述检测调用所述目标任务对象的运行函数还包括:
通过与所述目标任务对象的运行函数对应的钩子函数获取所述目标任务对象的类名;
判断所述类名是否为预设的待测应用的类名,若是,则执行所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁。
5.根据权利要求1所述的基于线程池的多线程调度方法,其特征在于,所述获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象之后还包括:
获取所述目标任务对象的哈希码,将所述哈希码与所述堆栈特征信息对应存储在缓存中;
所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁还包括:
查找与所述目标任务对象的哈希码对应的堆栈特征信息,获取与所述堆栈特征信息对应的计数锁和/或倒计时锁。
6.根据权利要求5所述的基于线程池的多线程调度方法,其特征在于,所述方法还包括:
在所述计数锁或所述倒计时锁的锁定状态释放后,将所述目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息从所述缓存中移除。
7.一种基于线程池的多线程调度装置,其特征在于,包括:
线程调度函数调用模块,用于检测线程池的线程调度函数的调用过程,获取所述调用过程对应的调用堆栈的堆栈特征信息和目标任务对象,所述目标任务对象为实现了线程接口的对象;
同步锁添加模块,用于检测调用所述目标任务对象的运行函数,在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁,检测所述计数锁和/或倒计时锁的锁定状态,所述计数锁在与目标任务对象对应的线程数大于或等于所述计数锁的阈值时释放,所述倒计时锁在等待预设时长后释放;
暂停执行模块,用于在所述计数和/或倒计时锁处于锁定状态时,暂停执行所述目标任务对象的运行函数;
运行函数执行模块,用于在所述计数锁或倒计时锁的锁定状态释放时,执行所述目标任务对象的运行函数。
8.根据权利要求7所述的基于线程池的多线程调度装置,其特征在于,所述线程调度函数调用模块还用于通过hook获取所述线程池的线程调度函数调用的堆栈特征信息和目标任务对象。
9.根据权利要求7所述的基于线程池的多线程调度装置,其特征在于,所述同步锁添加模块还用于通过hook为所述目标任务对象的运行函数添加与所述堆栈信息对应的计数锁或倒计时锁。
10.根据权利要求9所述的基于线程池的多线程调度装置,其特征在于,所述同步锁添加模块还用于通过与所述目标任务对象的运行函数对应的hook获取所述目标任务对象的类名;判断所述类名是否为预设的待测应用的类名,在所述类名为所述预设的待测应用的类名时,执行所述在所述目标任务对象的运行函数上添加与所述堆栈特征信息对应的计数锁和/或倒计时锁。
11.根据权利要求7所述的基于线程池的多线程调度装置,其特征在于,所述装置还包括哈希码对应存储模块,用于获取所述目标任务对象的哈希码,将所述哈希码与所述堆栈特征信息对应存储在缓存中;
所述同步锁添加模块还用于查找与所述目标任务对象的哈希码对应的堆栈特征信息,获取与所述堆栈特征信息对应的计数锁和/或倒计时锁。
12.根据权利要求11所述的基于线程池的多线程调度装置,其特征在于,所述装置还包括哈希码存储移除模块,用于在所述计数锁或所述倒计时锁的锁定状态释放后,将所述目标任务对象的哈希码以及与该哈希码对应存储的堆栈特征信息从所述缓存中移除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611122099.8A CN106681811B (zh) | 2016-12-08 | 2016-12-08 | 基于线程池的多线程调度方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611122099.8A CN106681811B (zh) | 2016-12-08 | 2016-12-08 | 基于线程池的多线程调度方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106681811A true CN106681811A (zh) | 2017-05-17 |
CN106681811B CN106681811B (zh) | 2021-09-14 |
Family
ID=58868530
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611122099.8A Active CN106681811B (zh) | 2016-12-08 | 2016-12-08 | 基于线程池的多线程调度方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106681811B (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107463439A (zh) * | 2017-08-21 | 2017-12-12 | 山东浪潮通软信息科技有限公司 | 一种线程池实现方法及装置 |
CN107577525A (zh) * | 2017-08-22 | 2018-01-12 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN108052396A (zh) * | 2017-11-27 | 2018-05-18 | 深圳市恒扬数据股份有限公司 | 一种资源分配方法及*** |
CN108628668A (zh) * | 2017-03-21 | 2018-10-09 | 北京京东尚科信息技术有限公司 | 一种多倒计时任务调度***、方法、电子设备和储存介质 |
CN108762940A (zh) * | 2018-04-12 | 2018-11-06 | 武汉斗鱼网络科技有限公司 | 多线程访问方法及装置 |
CN108985629A (zh) * | 2018-07-17 | 2018-12-11 | 阿里巴巴集团控股有限公司 | 业务链中业务节点的执行方法、装置及服务器 |
CN109032775A (zh) * | 2018-06-29 | 2018-12-18 | 武汉斗鱼网络科技有限公司 | 一种获取任务进度的方法、终端设备及存储介质 |
WO2019006997A1 (zh) * | 2017-07-01 | 2019-01-10 | 武汉斗鱼网络科技有限公司 | 程序死锁检测方法、存储介质、设备及*** |
CN109324916A (zh) * | 2018-08-09 | 2019-02-12 | 武汉斗鱼网络科技有限公司 | 一种任务执行方法和装置 |
CN109426702A (zh) * | 2017-08-31 | 2019-03-05 | 武汉斗鱼网络科技有限公司 | iOS平台文件读取保护方法、存储介质、电子设备及*** |
CN109739583A (zh) * | 2018-12-13 | 2019-05-10 | 平安科技(深圳)有限公司 | 多线程并行运行的方法、装置、计算机设备以及存储介质 |
CN109783239A (zh) * | 2019-01-25 | 2019-05-21 | 上海创景信息科技有限公司 | SystemC仿真调度核的多线程优化方法、***及介质 |
CN110362389A (zh) * | 2019-05-28 | 2019-10-22 | 深圳市道通智能航空技术有限公司 | 多线程退出方法及移动终端 |
CN113626244A (zh) * | 2021-08-26 | 2021-11-09 | 广州市百果园网络科技有限公司 | Anr异常数据的收集方法、显示方法、装置及设备 |
CN114817006A (zh) * | 2022-04-08 | 2022-07-29 | 北京字节跳动网络技术有限公司 | 一种堆栈信息写入方法、装置、设备及介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN103034577A (zh) * | 2011-10-08 | 2013-04-10 | 腾讯科技(深圳)有限公司 | 一种定位关机慢的方法及装置 |
CN104516732A (zh) * | 2013-09-29 | 2015-04-15 | 北京新媒传信科技有限公司 | 一种应用程序崩溃报告方法和*** |
US9032249B1 (en) * | 2005-08-26 | 2015-05-12 | Open Invention Network, Llc | System and method for event-driven live migration of multi-process applications |
CN105144117A (zh) * | 2012-12-14 | 2015-12-09 | 微软技术许可有限责任公司 | 对调用堆栈和上下文数据的自动相关和分析 |
CN105446886A (zh) * | 2016-01-04 | 2016-03-30 | 青岛海信移动通信技术股份有限公司 | 一种计算机程序调试方法和装置 |
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
-
2016
- 2016-12-08 CN CN201611122099.8A patent/CN106681811B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
US9032249B1 (en) * | 2005-08-26 | 2015-05-12 | Open Invention Network, Llc | System and method for event-driven live migration of multi-process applications |
CN103034577A (zh) * | 2011-10-08 | 2013-04-10 | 腾讯科技(深圳)有限公司 | 一种定位关机慢的方法及装置 |
CN105144117A (zh) * | 2012-12-14 | 2015-12-09 | 微软技术许可有限责任公司 | 对调用堆栈和上下文数据的自动相关和分析 |
CN104516732A (zh) * | 2013-09-29 | 2015-04-15 | 北京新媒传信科技有限公司 | 一种应用程序崩溃报告方法和*** |
CN105446886A (zh) * | 2016-01-04 | 2016-03-30 | 青岛海信移动通信技术股份有限公司 | 一种计算机程序调试方法和装置 |
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
Non-Patent Citations (5)
Title |
---|
DUANXZ: "ThreadPoolExecutor之三:自定义线程池-扩展示例", 《HTTPS://WWW.CNBLOGS.COM/DUANXZ/P/3380367.HTML》 * |
XIEYU_ZY: "Java线程池架构原理和源码解析(ThreadPoolExecutor)", 《HTTPS://BLOG.CSDN.NET/XIEYUOOO/ARTICLE/DETAILS/8718741》 * |
ZHANGK64: "Java模拟并发操作进行服务器压力测试", 《HTTPS://BLOG.CSDN.NET/U010642004/ARTICLE/DETAILS/50042781》 * |
腾讯BUGLY: "经典随机Crash之一:线程安全", 《HTTPS://MP.WEIXIN.QQ.COM/S/-TJ4FB86TGRNQECYQPY9PA》 * |
菜鸟大明: "JAVA模拟瞬间高并发", 《HTTPS://BLOG.CSDN.NET/ZHAO9TIAN/ARTICLE/DETAILS/40346899》 * |
Cited By (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108628668B (zh) * | 2017-03-21 | 2021-01-26 | 北京京东尚科信息技术有限公司 | 一种多倒计时任务调度***、方法、电子设备和储存介质 |
CN108628668A (zh) * | 2017-03-21 | 2018-10-09 | 北京京东尚科信息技术有限公司 | 一种多倒计时任务调度***、方法、电子设备和储存介质 |
WO2019006997A1 (zh) * | 2017-07-01 | 2019-01-10 | 武汉斗鱼网络科技有限公司 | 程序死锁检测方法、存储介质、设备及*** |
CN109213576A (zh) * | 2017-07-01 | 2019-01-15 | 武汉斗鱼网络科技有限公司 | 程序死锁检测方法、存储介质、设备及*** |
CN107463439A (zh) * | 2017-08-21 | 2017-12-12 | 山东浪潮通软信息科技有限公司 | 一种线程池实现方法及装置 |
CN107577525A (zh) * | 2017-08-22 | 2018-01-12 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN107577525B (zh) * | 2017-08-22 | 2020-11-17 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN109426702A (zh) * | 2017-08-31 | 2019-03-05 | 武汉斗鱼网络科技有限公司 | iOS平台文件读取保护方法、存储介质、电子设备及*** |
CN108052396A (zh) * | 2017-11-27 | 2018-05-18 | 深圳市恒扬数据股份有限公司 | 一种资源分配方法及*** |
CN108762940B (zh) * | 2018-04-12 | 2020-09-04 | 武汉斗鱼网络科技有限公司 | 多线程访问方法及装置 |
CN108762940A (zh) * | 2018-04-12 | 2018-11-06 | 武汉斗鱼网络科技有限公司 | 多线程访问方法及装置 |
CN109032775A (zh) * | 2018-06-29 | 2018-12-18 | 武汉斗鱼网络科技有限公司 | 一种获取任务进度的方法、终端设备及存储介质 |
CN108985629A (zh) * | 2018-07-17 | 2018-12-11 | 阿里巴巴集团控股有限公司 | 业务链中业务节点的执行方法、装置及服务器 |
CN108985629B (zh) * | 2018-07-17 | 2022-04-08 | 创新先进技术有限公司 | 业务链中业务节点的执行方法、装置及服务器 |
CN109324916A (zh) * | 2018-08-09 | 2019-02-12 | 武汉斗鱼网络科技有限公司 | 一种任务执行方法和装置 |
CN109324916B (zh) * | 2018-08-09 | 2022-02-08 | 武汉斗鱼网络科技有限公司 | 一种任务执行方法和装置 |
CN109739583A (zh) * | 2018-12-13 | 2019-05-10 | 平安科技(深圳)有限公司 | 多线程并行运行的方法、装置、计算机设备以及存储介质 |
CN109739583B (zh) * | 2018-12-13 | 2023-09-08 | 平安科技(深圳)有限公司 | 多线程并行运行的方法、装置、计算机设备以及存储介质 |
CN109783239A (zh) * | 2019-01-25 | 2019-05-21 | 上海创景信息科技有限公司 | SystemC仿真调度核的多线程优化方法、***及介质 |
CN109783239B (zh) * | 2019-01-25 | 2021-01-15 | 上海创景信息科技有限公司 | SystemC仿真调度核的多线程优化方法、***及介质 |
CN110362389A (zh) * | 2019-05-28 | 2019-10-22 | 深圳市道通智能航空技术有限公司 | 多线程退出方法及移动终端 |
US11853153B2 (en) | 2019-05-28 | 2023-12-26 | Autel Robotics Co., Ltd. | Multi-thread exit method and mobile terminal |
CN113626244A (zh) * | 2021-08-26 | 2021-11-09 | 广州市百果园网络科技有限公司 | Anr异常数据的收集方法、显示方法、装置及设备 |
CN113626244B (zh) * | 2021-08-26 | 2024-05-28 | 广州市百果园网络科技有限公司 | Anr异常数据的收集方法、显示方法、装置及设备 |
CN114817006A (zh) * | 2022-04-08 | 2022-07-29 | 北京字节跳动网络技术有限公司 | 一种堆栈信息写入方法、装置、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN106681811B (zh) | 2021-09-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106681811A (zh) | 基于线程池的多线程调度方法及装置 | |
Huang et al. | ShuffleDog: characterizing and adapting user-perceived latency of android apps | |
US9886305B2 (en) | Determining the status of plurality of threads by monitoring the execution of folded thread | |
US9384040B2 (en) | Scheduling computer jobs for execution | |
US9058417B2 (en) | Thread serialization and disablement tool | |
US8132170B2 (en) | Call stack sampling in a data processing system | |
Kalkov et al. | A real-time extension to the Android platform | |
EP2701074A1 (en) | Method, device, and system for performing scheduling in multi-processor core system | |
CN107704314A (zh) | 用于迁移虚拟机的方法和装置 | |
CN105404559A (zh) | 在数据处理装置中进行除错 | |
US20240152439A1 (en) | Detection Method and Electronic Device | |
CN113190427B (zh) | 卡顿监控方法、装置、电子设备及存储介质 | |
CN114327894A (zh) | 资源分配方法、装置、电子设备及存储介质 | |
CN112035839A (zh) | 一种竞态条件漏洞利用的检测方法及装置 | |
CN115981962B (zh) | 线程池监控方法、装置、电子设备及存储介质 | |
CN111901318A (zh) | 一种命令注入攻击检测的方法、***及设备 | |
CN106482742A (zh) | 计步数据的获取方法及装置 | |
CN106407016A (zh) | 一种多线程争抢资源的模拟方法及装置 | |
CN109408336A (zh) | 一种启动项监控方法、装置、终端及计算机可读介质 | |
US9053227B2 (en) | Concurrent assertion | |
CN111831436B (zh) | Io请求的调度方法、装置、存储介质及电子设备 | |
CN106021106A (zh) | 一种进程控制方法及用户终端 | |
CN104731661A (zh) | 一种回收泄露的程序运行资源的方法及装置 | |
CN115576667A (zh) | 业务线程终止方法、装置和*** | |
CN118170507A (zh) | 任务管理方法和装置、存储介质及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |