00:00
我们接着来看下一种方法。下一种方法是把耗业务放到我们在这个contact中,就添加到形成词。那在这里这个地方呢,我们是这样来处理的,大家看。也就是说。也就说我们也可以这样去处理,怎么处理呢?大家看到。我们现在这个server handler这边还是以普通方式来做,对,还是以普通方式来做,但是呢,我可以这样来做,在e server里面我先创建一个。在这里。创建业务线线程池。业务形成词,那这个时候我们怎么去创建呢?也非常简单,就这样写就是static。对,然后ban了。Even。Event什么呢?A group,对,然后我取个名字,仍然叫group。
01:01
对于六一个什么呢,Default。Event extor group。然后在这边我为了让大家看到效果呢,我故意只设置两个,大家看这里,这里我们就创建。创建创建两个。两个子线程。在这个线程池里面有两个直线尺。Me,好,那么在添加的时候呢,我们不再这样添加equal。Server handler它这样添加怎么添加呢?这样写。配点大家有看到。大家看last里面呢,它有这样一个方法,就是你可以指定event group,所以说我在这呢,直接group,然后再六一个E。S handler,那这句话的意思是什么呢?我们来解读一下啊,说明一下。
02:01
说明,如果。这样写哈。就是。如果我们。我们在时时。添加什么呢?这个at last不是添加添加handler的吗?是不是handler前面带的有什么呢?前面有。前面有指定。指定什么呀,就是我们所说的这个东西,Event group。那么该,那么那么该什么呢?该handler handler会优先,优先。加入到加入到该线程池中。哎,就这个意思,那大家想。我们在没有这个group的时候,也就是说假如我们按照以前默认的方式添加,大家来做一个比对。默认如果我这样添加同学们,我们在这里执行,执行的时候这个线程。
03:06
就是当前这个线程的名称是不是就是我们worker group里面的某一个子线程,是这样子吧,再来验证一下。好,我把这个呢先停一把。好,我们再做一个小小验证。看看,待会儿跟我们那样处理过后有什么不一样的地方。运行我们的十。运行我们的server,然后再运行我们的客户端。没有问题,那这个时候呢,我们可以看到此时此刻e server handler他用的的的确确就是no event group,也就是我们的worker group的线程,对不对,下面也是当前的,诶,为什么这个还是啊。哦,这么我。这个名字没有改哈,其实这个这个不能再叫他了,应该是。
04:03
应该改成什么呀,普通普通调用的方式。普通调用方式的线程对不对,所所以所说说明这确实是一个没有问题,那现在呢,我把这个改了,我要把它改成什么样子呢?大家看我要把它改成这个德行。如果改成这个样子,大家会发现呢,它这个时候会把我们的e server handler加到哪里去呢?加入到我们这个线程池的某一个子线程,因为它有两个,所以说要么是它这个线程里面第一个,要么是第二个,好,我们再来验证一下。同学们,我现在呢,已经把代码改成了这个形式来运行之。运行。运起来过后呢,我们同样再运行一个。朋友看,跑起来看我们的server端,是不是这个时候e server handle的线程就变成它了呀?是变成他了。然后过了过了十秒过后呢,还会再输出一次这个字,那我问大家,如果我再起一个个端。
05:04
请问这边是几了?客户端。这边就是二了,就是因为我你你这个线程池里面有两个直线程嘛,所以选的是二,那我问同学们一个问题,如果我再来一次。那么这个时候12端会选哪一个呢?是不是又选二二杠一了,因为你现在这个线程池里边就俩线程。那第一次这个客户端来了过后,他选的是他第二个客户端来了,选的是他第三个客户端来了过后呢,又选他。啊,所以说如果你再启动一次。他又选的是哪一个呢?二杠二这个线程。看是不是二杠二了。如果你再来一次客户端又选的是二杠一了。看同学们是这样子的。OK,完全的正确,所以说这种方式呢,就是说我们说通过这样一种方式,我们也可以把我们handler。加入到一个线程池里面去,当然它也是相当于说你在各个不同的线程里面执行,那么我们来分析一下这个源码。
06:04
和它的相关的说法哈,在handle中代码中,在handle的代码中就使用普通方式来处理,那么这时呢,我们可以在调用方法的时候添加线程时后,Handler将优先使用这个线程词,如果不添加就使用IO线程。当走到哪个地方可以来验证呢?当走到abstract handle contact的这个invoke read的方法时候,他会去仍然做一个判断。是不是,呃,就是ex in event loop,他会判断你这个执行执行器是不是当前的李先生,那么大家看这里面有说法,它这是不会通过了,就是你如果是优先加入线程时,这个不会通过,因为当前线程是IO线程contact的ex的。就当前线程是呃,IO线程,而我们这个是个业务线程,所以说。
07:02
按照你这种写法呢,他会义不执行,我们来看一下是不是这样子的。也如果说一步执行的话呢,它会进入到这个run方法来,我们仍然是下一个断点来进行验证,同学们跟上老师思路。那这次呢,我们下的断点就发生变化了啊,我们在源码包里边找到一个断点。找到断点,给同学们搂year。移到这边去吧。大家看我待会儿呢,把断点就直接下载。Run方run函数里面的一个next invoke China read,那那同学们注意就是如果我们是使用使用加入到一个异步线程去处理呢,它会按照这个wrong方法来执行,如果你没有加的话呢,它直接就在上面执行,我们看是不是这样子的来同学们。现在呢,我们来。
08:00
看一下此时此刻哈,就是按照我现在写的代码呢,我们是加到一个线程池里面的,对不对,所以说他就会按照我们刚才写的这个run方法去进行异步的执行来验证一把。我们先把这些都关闭了,一次性的全部关掉。关掉以后呢,我们仍然是启动debug。同学们注意下。Debug。好的,第八个过后呢,我启动一个后端。同学们看,启动客户端过后,你会发现它时,它按照这个时间就定到这儿了,看到没有。是不是到这来了,进入到这个wrong进行一个异步执行,那如果同学们再来看,我去掉这一种添加方式,我按普通方式来添加,它就不会进入到我们这个异步执行的代码。这是不是普通普通的方式添加。对吧,而且呢,在这个handler里面呢,我们也没有做呃,任务的提交,那这个时候同学们再来看一下这段代码会出现什么情况呢?还在刚才那个地方哈。
09:02
那个断点地方下在哪呢?诶找不到了,找不到我还得重新找一下。还在这再重新找一下。还在刚才地方下个断点。来做一个小小验证。进到这里面来。然后呢,我们把断电仍然下在这个round,看到没有。好,我们看看这个时候还会进入状吗?可以了,告诉大家就不会再进入状了,因为它不会进行这个异步的执行,你当前用的是IO线程,那它就只走IO线程了,那同学们看。那我们仍然在这个地方来进行一个,是啊,这下断点已经下好了。走起来,Debug。第八个。B勾呢,看到断点确实是在这是有的,就在3353行,然后呢,我启动一个client。走起来。好,同学们看。现在没有进到这边来。等到我们这个结果返回来了,过后呢,它都不会进入到run函数,说明他此时此刻并没有进行异步的调用。
10:05
看这边已经执行过了吧,诶这个看这边都已经回来了。是吧,我们debug这边是不是普通方式走的,而且一直没有进入到异步执行,这说明什么呢?来往下看。说明什么?就是我们在验证的时候,在这个地方我们可以看到。当走到我们这个contact,呃。Handler就tra handle contact的这个方法的时候,Loop是不会通过的。对吧,就是如果我们是按异步执行的,他不会他就不会通过,不会通过呢,它就会进行什么呢?它会执行到下面这个代码,就是不会通过这个,就会进入到下面这个,那如果通过了这个呢。那他就到这个断点来了,能理解吧,那这个断点该怎么执行,同学们可以在这下个断点,你看我们在下这下个断点,他这会儿到这儿,而不是到这儿,我们看是不是这样子的。
11:01
来,同学们,我们再次下个端点。跑起来debug。没问题吧,然后呢,再让一把,我们看他是到这儿还是到这儿呢。好,大家看是不是到这来了,到这那你下一步该干什么事情,你就去走呗,就invoke China read,调用我们的方法,那就开始调handle了,往下继续走就行了,没有继续我们因为我我们那那种。加多线程池的处理方法是跟他不一样的。好,各位同学,那关于这个字点就说到这,最后呢,我小结一点,这两种方式呢,给同学们做一个比对,第一种方式在handle中添加异常呢,可能有可能更加的自由,比如我们需要访问数据库,那我就异步,如果不需要,我就不异步。异步会拖长接口响应时间,因此需要将任务加入到我们这个队列里面的时候呢,如果IO时间很短,任务很多,可能一个循环下来都没有时间执行整个task,导致响应时间达不到指标,这是第一种方式的优点和缺点。优点是。
12:09
自由。缺点是什么呢?就是一不会拖长响应时间,如果我们I时间短,Task很多,那一个循环下来过后呢,都没有时间执行整个task,导致响应时间达不到指标,说他也有优点,有缺点。第二种方式呢,它是一种标准的方式,就集加入到队列里面去,但是呢,这样做会让整个handle德尔大家看这里它会将整个handle德尔都交给业务线程,不论耗时不耗时都加入队列,不够灵活说各有优劣,也就是说D我们这种方式。就是我们现在讲的第二种方式。它因为是在这个位置。是在这个位置就已经把你的handler加入到线程池里面了,那也就是说你在这个handler里面所有的代码默认的情况下都会怎么样呢?都会你就说你因为你你这个handle里面有很多方法嘛,那那那这个方法里面可能有很多业务要处理,那这个时候他就不管了,那他不管那么多,他就整个都按照。
13:11
在那个那一个线程里面执行。如果说按照第一种方式呢,它的好处是你可以选择,你可以自由啊,如果我在进行某一个操作的时候,我让去一补。啊,异步完了过后,他又回到这个I线程,明白这意思吧,说它更加自由,更加自由,好的,那关于这两种。就是我们讲的。讲的这个字点就是handler中加入线程词和在countr中将任务加入到线程词的源码剖析,还有它的案例就给大家讲解到这里。
我来说两句