00:00
Hello,大家好,我是fantastic,今天填一个坑啊,上次我们讲到Java与性能测试中线程管理的部分啊,中间留了一个坑,说我们这个线程同步类。啊,他在这种。可变现乘数的场景下不太适用。啊,在这里我们会等到有一个O,等待线程重新计数的时候,如果我们线程里面增加了,增加的话。它新的线程其实是没有get到这个基数的啊,我们在这里面看一下,就在这里面就有一个new的。Test我们可以去看一下,它这里面没有把那个countdown进去之后,如果我们建了十个啊,我们添加11个,前十个会看得到,都会自行看到。假如说我们中间有。就改它这个stop,就是十个cut down之后,它这个wait代码就已经等待通过了,已经。
01:01
那通过之后我们再新建新的第11个线程的话,呃,这个看down它其实在这个位置,在第52行已经不起作用了,这个service会执行小当啊,小down呢,其实它是一个线程词的小当,这个小当呢,它的含义就是说我关闭线程词啊,但是我如果线程池里面还有在跑的线程,或者说我的线程池里面还有在的等待队列里面还有任务的话,我会。进行一个执行,把这些全都消耗完之后再去关闭,所以下当呢,其实只是一个关闭行程值,不再接受新任务,还有一个下的当道啊,这个呢就是直接去关闭,我们看一下它的这个是直接关闭所有的activity的activity test。这个就是直接把线程都给关了,把这个。正在waiting的那个任务直接返回回来,它会返回回来一个list variable的一个。List之所以说在这里面不使用呢,因为就是看,当我们之前分享过,它是一个就是说使用的前提就是我必须得明确的知道我看的档案的数量。
02:11
而且中途是不能改的啊,然后对于我们这种可变的话,其实就很不适应啊,所以这里面我的建议就是我们可以替换出来另外一个。啊,这里我们这个改动有点大啊,我们不用看大浪啊,我们就用这个先保留着吧,因为它也不阻碍。有个飞ER这个线能同步类呢,就是说我们有一个飞ER的一个对象,跟它的区别就是飞ER它是非常的灵活,而且它有多阶段的这种属性没有使用这个报错先忽略,应该不是报错,它只是一个善意的提醒在够里面,如果你这个声明了一个变量,但是没有用的话,它便异会不通过,那Java里面无所谓的,诶我们这里面先不管看到它的使用方法呢,也就是说我们如果。
03:01
在在这个地方增加一个构造方法里面的一个参数,我们在这里面,这里面我们要申请一个。这里面把这个放进去,那这里面构造方法这块,还有这个创建现成的方法就已经完事了,OK了,我们假设我们在执行某些任务的时候,我们用run啊,我们是在run的这个方法里面写我们的业务,我们注册一个,这就是表示我们已经注册成功了,增加了一个需要同步的。线程,然后如果是针对于这种场景,因为我们史蒂夫的200毫秒嘛,如果我们这有某一些线程,它在200毫秒以内,就是已经执行完了。啊,这种场景也就不太适合了,这种方法可以放在这个高档方房里面,我在拗的时候就把这个给注册进去啊,但是对于这种S蒂的话,我感觉效果也差不太多啊,通常我们这种动态的现场,这种模型的使用场景就是说非常长期的。
04:04
不是说像那种十几分钟,一半小时,一小时的,我们可能会跑好几个小时,而且在这个过程中,我们会不停的在变啊,所以就是说这个线单个线程它的任务的运行时间是非常长的。这所以也就可以我们如果是使用up这种起线程的方式的话。应该是容错率还是挺高的,嗯,我们就写在这个这个里面,我们假设61行到62行不会报错,这是我们执行所有的代码。啊,我们执行任务的时候,这里面呢,我们写这个a arrival and,我们在里面写到一个arrival and,就是我们。简单结束到这儿之后啊。就是有一个注册啊,有一个反注取消注册,我现在同步线程已经结束了,所以我们就可以。把这个现成的基数,这个相当于一个基数吧,在非ER里面的一个基数给注销掉,因为非ER它具有多阶段的这种属性,就我下一个阶段我就不算这个数,比如说我们去测了五个十个线程,然后又加了十个线程,就我们注册20个线程,但是我们第二阶段只需要五个线程的话,我们其中15个线程就需要注册掉,如果是你不呃还在等到这20个线程再进行一个arrival的一个。
05:28
呃,结合点啊,才能进行下面的事情啊,所以这里面通常在行能测试里面,针对于框架来说不会有那么复杂的,但是如果是在这个check catch这个这个代码块里面有可能会有复杂,就是我们测试的过程里面,可能整个测试的场景会分好几个阶段,如果我们所有的阶段进行要进行同步的话,那我们就会采取这种方式。非他类的功能非常的。对我来说非常的复杂,它还有多阶段的,就是负类同步,还有一个子对象的一个同步,这个有兴趣的话大家可以去看一看,通常我们采取的是这种方式。
06:08
And wait,我们在这里到达,等待其他的。技术到达,这用技术有点不是特别合适啊,但咱家可以理解起来,我感觉从抗大起到这个。会比较流畅一些。这是一个比较标准的一个实现吧,在实际的工作中用的最多的,通常这种分的话是用在有那种强同步的需求的话,会在这里啊,但是就像我刚才说的。呃,其实我们大部分的代码执行到啊,第52行在这种动态场景里面,其实都不会有它往下执行了啊,大家就怎么说呢,我这个线程系数我到不到,在第53行以后,其实对整个测试是没有什么影响的,呃,为什么呢?因为你看我们现在后面做的几项工作线程53行,54行,其实。
07:05
都是一个功能点,需要等待所有线程同步结束,那全都运行结束之后我再去。这是一个检查,但是我们的线程其实是一直在跑的,是人为的主动结束掉整个测试的过程。要么通过关,我们在。没有演示,要么我们通过起一个服务,这是我们的测试任务,再跑通过服务的接口跟外界进行交互啊,要么我们通过别的什么方式进行交互,从外界拿出来命令之后,去主动的结束掉整个的线程的运行,或者说直接把这个进程给关掉。是这样,没有说程序性结束啊,除非是我们有,呃,假如说你这里面报错率达到10%或者是5%,这样就主动结束掉这个进程。就是程序内部的一般都是,呃,外部这个五三和五四,其实就是没必要的,因为我们线程永远都不会停,只会的增加和减少。
08:07
呃,55这块呢,也是。这是关闭我们的线程池,线程池我们的运行任务一直都在运行,线程池肯定是不会关闭的,这个就是线程测试结束,这个是一个标志。啊,通知消息或者干啥的,因为我们的前程一直在运营,它永远不会结束。啊,整理性能数据测试验的测试结果,呃,这个呃,我们分两部分看,第一部分整理性能测试数据,因为我们的测试数据是一直在产生的,所以它这个地方通过测试结束之后去整理性能测试数据,其实也是不需要的。啊,我们需要在动态测试的过程中,实时的去输出我们的测试数据,这一点可以通过一些监控,通常都是通过监控啊,用力的数据以及被测的服务,或者被测对象的其他监控指标进行一个展示啊,数据的一个收集。
09:00
呃,后面我们再讲这种,呃,动态模型的数据的。收集整理,这针对case这边的,跟之前是分享过,但是稍微有一点差异,有时间的话单独再讲一讲验证结果啊,通常我们验证结果就是说呃,在比如说我们抢红包,假如说我们抢红包就这种。短时的我们可能就运行了十几分钟红包抢完,然后去验证测试数据是这样的,但是这种常识的我们很难去验证。像场景,比如我抢红包这种场景,其实也不太适合用这种。啊,动态的线程的这个模型去做设计我们的压缩case哦,验证结果的话,通常来说我们这个纯粹的就是在做压力测试。业务验证的话,我。我们可以,比如说我们就用户登录吧,我们需求是用户,所有的用户登录都成功。假设我们认为他业务的扣的为零,ATP扣的为200,这个就作为业务验证的一个通过标准的话,我们就在实时的测试过程中,比如说这个这个地方就登录,OK登录啊,我们判断一下登录是否成功,Code等不等于零,A的扣的是不等200。
10:19
这样呢,我就去报一个成功的技术。啊,否则的话,我们报一个失败的技术,我们通过这种实时的数据的上报,上报到某一个地方,或者说自己。地的汇总上报。啊,再去实时的去输出这些验证的结果是这样。啊,所以这也不太,呃,56行和57行其实在整个测试过程中都是需要实时输出的啊,所以就不需要56和57行再单独等所有的配置执行完就结束,所以我们在这种场景下实际运行到52行就已经够了。后面就是跟。嗯,整个JM之外的信息进行一个沟通啊,或从外部获取。
11:05
或者说是从外部获取到命令,我们的命令是通过,是需要增加线程,减少线程,嗯,结束任务,或者说是。起一个新的任务,如果是你是做新能车的服务的话,别人可能就传递了一个新任务过来,你还要起新任务这样的,所以我们这个啊菲啊,实际在这种场景下用的也不是很多啊。我今天的分享就到这里了,已经把线程管理的一个坑给填上,我们下期再见,拜拜。
我来说两句