00:00
我们对handler中加入线程词和contact中加入线程池源码进行剖析。同学们还记不记得我们在前面讲过,在nit中,如果我们做耗时的不可预料的操作,比如说数据库网络请求,那么会严重的影响Nike对socket的处理速度。当时我们是怎么处理的?是不是这样处理的,大家看一下,在我们这段代码里边回顾一下。我们是怎么处理的呀?是不是在ninety serve handler里边,我们加入了用户程序,自定义的普通任务,把它提交到一个什么呀,提交到一个队列里面去的,就是我们所说的他是个Q。但是大家有没有发现这种解决方案,这种解解决方案有什么问题?有什么问题没有?好,我们来回顾一下,当时我们解决这一个耗时操作,或者说或者说能够去把一个任务加到队列里面去,这种方式就是我们原先用的这种方式,它有什么问题?
01:08
那这样子为了把这一个问题说清楚呢,就说把这个问题说清楚,我们才知道为什么要现在要讲在handler中加入线程词,或者在contact中加入线程词去解决,解决什么呢?解决异步,把任务添加到异步线程词这么一个必要性,好了,同学们,我们先看一下原先这种解决方案它存在的问题,那这样子说。我们呢,还是在这里新建一个包,把这个ECO程序拿过来用一下。做演示嘛,我新建一个包,同学们跟上我的思路。硕士。点什么呢?ECHO2,比如说我们这一个一个二,我同样呢,从这边把代码拿过来用一下。因为我们需要在做。
02:02
讲解的时候需要程序的演示。我把这四个文件拷贝到E口二。没问题。好的。拿到这边来了哈,那拿到这边来以后呢,我想做一件什么事情呢?大家看到假如假如在我们这个RA的这个操作操作中,我们会有一个任务的提交。我们还是按以前按照。按照原来。原来的一个什么呢?原来的方法。方法处理一、处理。处理耗时任务。我们原原来的方法是怎么做的呀,是不是。我们是提交一个任务到队列。那现在呢,我们把原先那个解决方案拿过来直接用一下。在这边是不是这是解决方案,我把这个解决方案呢,就直接拿到这边来。
03:05
没问题吧,这里面相当于说我们这会在这一个队列里面呢,会去休眠五秒,相当于说执行了五秒的一个操作。然后呢,我在这里大家看到在这里面呢,在这个run函数里面去,我把什么呀,我把它当前的线程名称输出来。输出现成名。同时呢,我在China这边也把。线程名输出来我这样写。E。Handler的线程词,线程是。等于我输出一下当前线程的信息,比如说得到current th,然后呢,Get。那同样在这里边呢,我们认为是在这个队列里面执行的时候使用的线程,我们也把它输出来。
04:01
待会呢做一个做一个比较,我们认为是在XQ的吧,我们认为这样写。在handler里边,我们有一个。它的线程信息。OK,线程式同样我也把它输出来。帅。点CN.get name。好的,这是我们在这边提交的,呃,一个自定义的普通任务没问题吧,是不是。是不是在这个过程中呢,代码它是不会阻塞在这里,因此呢,我在这写个勾啊。OK。高望。那现在呢,同学们来看一下。如果我们这么去做。这两个地方这边的县城和这边县城是一个怎样的情况,就是说这两个县城是同一个县城呢,还是。不一样的线程,我们要把这个问题解决好,那这样子呢,我在客户端这边也做一个相应的处理。
05:04
在我们这个客户端这边。这边客户端这边呢,我们在China read active的时候呢,我们发出一个信息过去,这个没问题吧,比如说打一个招呼给他,我就我就不这样说了,我这样写。我写这么一句话。给服务器,服务器发一个消息。发一个什么消息呢?咱们就简单一点,CTx.right andsh。然后呢,非磁化的iPod。IPod点。Copy。然后这边我们写上这么一句话,Hello IAM。I'am sorry I am glad。对对,然后这边我们给他来一个什么呀。来一个编码的形式,这样子写get。Betty吧,Get bits。Get bits。用这个就行了,Get。
06:02
Bets。加S。那在这个地方处理的时候呢,我们拿到这它会怎么样,它会有一个这样的信息的抛出,那怎么办呢。这棒怎么办呢?同学们想。是不是只要把这括号打起来就可以了,对吧?好,这是我们这一块的一个处理。这块处理大,就说我们这边呢,直接发了一个hello I'm client到我们的服务器,服务器这边呢,是不是就可以接收到这个消息了,没问题吧,好,现在呢,我们在这个地方,服务器这边呢,待会我们也也也有可能回送消息,所以说我在这个China read这个地方呢,再做一个相应的改进。这边我们接收。接收服务器消息。那我就这样写就可以了,首先呢,我们拿到一个b buffer。
07:01
等于把MSG进行一个转换。拿到这个消息以后,我们干什么六?是不是六个大小。等于get readable。Get read就直接read就行了,Read。是这个吧,Readable bits。拿到拿到过后我们得到一个BAT数组,拿到这个BAT数组呢,我们认为就是它的一个回回送的信息,那现在呢,我们把这个回送信息读入到。对,我们read bit。把我们这个信息放进去就是BA。就是从这个buffer里边,从这个BA buffer里面,把数据放到我们这个BA数组里面去拿到这个BABA数组里面过后呢,我们把它转成一个轴串。
08:02
对,转成一个字符串,那就是我们的什么呢?就是这边的X。然后按照一个规范来做就可以了,比如说我们这写一个。UTF杠八。UT。UTF杠八。那这边呢,我们用这一个。用这个吧。抱起没问题吧?这就拿到了一个字符串。那这个字符算过呢,把这个信息与输出。说信息是什么,我们拿到MSD。S等于。什么呢?输出来就可以了。好,也就是这边呢,我们发了一个消息给服务器,然后呢,China read再把服务器发过来的消息进行一个显示。
09:01
好,回到这边,同学们回到这边,回到这边呢,我们现在想来看一下。就是当我以这种方式,你看我这回了一个哈。这个呃,客户端。喵喵喵,是不是把这个信息给发出去,发出去过后这个信息我就不打了。这个信息我就不打了,我重点呢,想看一下当前执行的时候,这个线程和下面这个线程,就是这这个地方看到线程,他们是不是同一个线程,那现在呢,我们来运行一下。好,我运行先运行服务器端。好,这边运行起来了,然后呢,我们。哦,这个地方我点成debug了。重新来写。Rock。
10:01
跑起来跑起来过后呢,我们运行客户端。同学们看。此时此刻,此时此刻。我们可以看到服务器这边呢,它打出的线程,第一个是这个线程名叫IO group group3杠一,它在这一个SQ的里面,线程呢,仍然是这个线程,那也就是说实际上在你发一个消息过去过后。我们虽然是提交了一个任务到队列里面去,但实际上他他们这个handler的当前的线程和这个任务执行的线程是同一个线程,换言之,什么意思呢?就是在这个地方。跑的时候你给的,你在这在这个处理的过程中啊,在这个读取处理过程中,你把这个任务。放到的这个线程呢,跟我们当前这个handler的线程是同一个线程。
11:03
哎,也说你在处理的时候是同一个线程。那么问题就来了,假如说我们是在同一个线程,其实它仍然是有。一个阻塞的问题,比如说你你的线程在这里进行进行操作的时候,你的线程也不能干别的事情,因为你是同一个线程嘛。好,那这样子的话呢,我们可以再来试一下,比如说我们再次提交一个任务。同学看,这是我提交第二个任务。那这个这个呢,我在这儿再打一个信息哈,比如说。我在这写的县城二。我们再来运行一下,看看你整个提交的信息是不是都是在同一个线程跑运行。好的运行起来,然后这边呢,我们再次运行。那客户端这边就应该接收到两个回复消息,没有问题吧,同学们。好,你看第一个handle的当前线程是这个。第一个HQ的线程是三杠一。
12:02
第二个SQ线程二仍然是三杠一,这边会接收到两个好,那这样子的话,其实我们没有做到什么呢,没有。没有做到将任务添加到一个异步的线程,现在你加,再按照原先这个方式,其实你是加到同一个线程的。对吧,所以说如果说这样做的话呢,我们在这个地方执行的时候,你其他的队列还是要进行排队,还是会阻塞。下面呢,我们就来探讨新的一个问题,咱们怎么样把耗时物添加到一个所谓的异步线程式去做,那么在我们来里面呢?他把这个任务添加到异步的先程词里面,有两种方式,第一种方式呢,就是在handle中加入先程词,第二种呢,就在contact中加入形成词,我们待会儿呢先先来解决这两种。
13:01
呃,这两种方案,然后呢,我们再从源码的角度来分析,到底他是怎么执行的。好,那第一个问题,呃,就是我们已经把这个问题抛出来了。那下面呢,我们就准备解决。
我来说两句