00:00
下边呢,我们有一个课堂的练习题,这个课堂练习题呢,我们作为课后作业去做,因为时间呢比较紧张,这个作业当做课后练习啊,本身想让大家练一练,但时间有点紧张,所以说这个题呢,我们就作为一个课后练习。下面我还要讲一个东西,课后练习。好,现在呢,我们要讲一下什么啊,我们要讲一下China的关闭便利的一个演示。然后这个讲完了以后呢,我们就可以来写这么一个小案例,把这个小案例怎么能讲完,今天就算是很不错了,因为你把这个讲完,你们就可以自己去解决前面我们讲的那个一个比较重要的问题了啊,只要把这个应用实例讲完,就可以解决这个问题了啊好,现在呢,我们来继续往下走,这个这个作为一个课后练习,同学们课后要去练啊,具体要求看笔记。好,这是课后练习,那么我也把它整整到笔里面去吧。
01:02
然后呢,我们接着往下讲,这个作为课后练习题。好,我写到这里,课后练习就是管道的课后练习。管道。管道的课后课后。课后练习题,来给他一个标题二。给他一个标题。好,接着往下看,下边呢。我们来看一下广告比较重要的两个知识点,一个是China的关闭,因为你不讲China关闭,就前面那个问题还是解决不了,就前面我们其实还有一个待解决的问题,大家还知道啊,我们刚才还有一个待解决的问题一直没有解决,那为什么没上来解决呢?因为你首先对China要有一个基本认识。你不认识这个东西,你也解决不了,所以现在我们来看一下圈的关闭是什么,各位同学请看。使用内置的函数close可以关闭这个管道。
02:02
当管道关闭以后,或者叫channel关闭以后,就不能再向channel写入数据了,但是仍然可以从该channel读取数据,这是它重要的一个特点,就是说。他一旦把这个圈都关闭了,只能读而不能写,那言外之意就是这个意思,打开我们的示意图,就说他一旦都关闭了。那么你往你往里面再写是不行的,它相当于说一旦关闭,你可以这样理解,就好像在我们这个管道的屁股后面加了一个标志。加了一个标志,比类似于像e of这样一个标识,就代表说别往里面加了,我不接受,就好比一个很简单的道理啊,现实生活中,现实生活中同学们,你们去一个。地方买火车票啊,买火车票大家都排队。后面这个。管理人员发现这买火车票怎么这么多人呢?把大门一关。
03:04
是不是就没有人再进到这个这个队列里面,你不知道你买了吗?但是前面排队的人是不是还是可以买完票走人的,你不是说诶我把门关了,你们你们这还有十个人在排队,你们就别出去了,就就跟这过了,他还是可以买完票就走吗?说很形象啊,很形象,你这么去理解就觉得不难,就说他这个很形象,就是相当于说我把这个地方关起来加了一把锁一样的感觉啊,就写锁想写写不进去了。那那个锁呢,它的那个机制有点类似于,类似于我们前面那个全局就是加了锁,但是我不lock了,Unlock没有了,只有lock类似于这么一种动作,好这个这个所这个基本知识就说完了,那么我们来看看是不是有这个特性呢?我这里举了一个例子,比方说待会呢,我举了这样一个案例,我创建了一个可以存放100个int的管道,然后呢,我通过便利它的这个容量增了100个去去。
04:05
扔了100个,这个时候再往里面写就会报错,来看一下哦,这个是便利啊,就是便利,我们先说这个管道关闭吧。先说关闭,同学们啊,不着急。好不着急啊,这个东西。呃,China的关闭,China的关闭。关闭应该是它的便利这块细节了,对,是它的便利啊,不着急便利。那这个地方应该有个标题三,标题二这篇实际上写的才对。就是China的便利和关闭,给他来一个标题,二关闭呢是其中的一个标题。好啊,首先呢,我们看到它的一字写错了啊,同学们。这是标题二。好,这样就对了,这样就对了,来,我们看一个关于参照关闭的小案例。案例隐私,案例隐私啊。
05:02
好,同学们,这是俺的意思。好,看一下案例演示,各位同学。因为它是枪口的关闭,所以说我新建一个文件夹。叫叫。Close。好,新建一个文件,各位朋友。泪点。好,Package主包,然后呢,Import。好,现在我写一个主函数。那主函数里面呢,我们先做一个管道,比如说int管道简单一点啊,这次我们就呃,直接make。Make,一个串。Int,然后呢,三个数据,三个数据。好,同学们,现在呢,我往里面扔数据。好,我往里面扔数据啊,看第一个我直接向往,向往里面先放两个数据,这个很简单的串。
06:05
我先放第一个数据是一个100,再放一个数据是一个200完事,本本身它还可以放对不对,因为因为它有三个空间嘛,它容量三个,但是呢,我很了一点,我直接close。In the,注意同学们,这个这个函数我们来看一下是干什么的,Close这个函数呢,是专门用于关闭我们这个管道,打开我们手册,大家都一样啊,这个close是一个内置函数,所以说你看这个包包呢,应该在build in里面。比一里面呢,你会看到有一个函数就叫close,大家看它写的很清楚类型,他说内置内间函数close关闭关闭信道,那这叫信道了啊,其实我们叫管道啊,比方中国人都叫管道啊,这个信道也不知道什么,可能是会不会是一个是一个是这个台湾人翻译的啊啊,那一旦关闭了过后呢,大家看这写的很清楚。
07:01
该通道必须为双向的或只发送的。它应当有只由发送者执行,而不应当有接受者执行,其效果是不用管那么多啊,其效果是在最后发送者值被在最后发送的值被接收后停止,该通道啊就变成通道了啊,你就没法看这个解,没法看这个一会信道刚诶信道完通道又变什么玩意儿了啊,等到一会儿又出现一个新的概念啊,从最后的值,呃,在最后的值从已关闭的信道中接收后啊,任何对其接收操作都无阻塞成功,也就是说这个时候只能往只能堵而不能写了啊只能读不能写了,其原因就是这样子的,那么同学们来看,那么你在取的时候呢,这个OK,就说一旦关闭了过后,如果你取的时候它有两个值,但但实际上本身有两个值啊,一个是X,这个X就从里面取的值,这个OK呢,就代表是否取出来了,明白我意思吧,啊这个意思好,需要的时候我们。
08:06
后面还还会用到这种写法,还会用到这个写法来,朋友们,我们看代码,现在它一旦关闭了,我们看写还能成功吗?这时这时不能够,不能够在。在写入。写入。写入数据到这个参了。好,是不是这样子的呢?应该是这样子,对不对,好,我们往里面再写一个,同学们看他会报错。比如说我往里面写个300。然后呢,我们。来执行一下,看这方能不能正确执行啊,我先这样写一下form.print。艾伦,好,我输一个,OKOK。OKOK,那同学们请看我执行这段代码啊,CD1点点CD到我们close。Sir写错了。
09:00
China,然后我们go run,命点go。好起来。同学们可以看到他在哪一行报错了呢?各位同学请看,他说send on closed channel,就说你你报了一个恐慌pan,为什么呢?因为你像这个关闭的这个通道里面散的数据散的不就发送吗?U里面发送数据报错了,具体来说是13行,13行正是我们的这一行。错了,但是呢,读是没问题的,读是没问题的啊,读可以说老师读行不行呢,可以的,当当这个管道,管道关闭后,关闭后读取还是可以的,读取数据没问题,可以读取数据是没的,没可以的。好,我们来看看读能不能成功啊,比如说我用个N一来接收。好,我这样读一个,我就读一个数据就行了。吃。
10:00
好,Format print。我直接读出N1等于N1,好,各位同学请看代码,我们仔细一下抛。好,你会发现没问题啊,100确确是读出来了,所以这个特性呢,大家要有一个基本的认识,就是讲的是关于参照关闭过后它的一个具体的情况,好这块呢,我们先把它拿过来。好,这个大家基本认识要有啊。好,紧接着呢,关闭咱说完了,咱紧接着说一下便利,因为刚才我们在做这个管道时候呢,我们是一个一个取的,假设它有100个数据,你一个个取,那不那不是死定了吗,你不能一个个取,那取取取死你啊,假设我管道里面我放了1万个数据,你你写1万哈,不现实,所以说呢,China呢,它是支持这个便利的,便利呢,主要我们用的是for。我为什么说要用for,你不能用那个普通的for循环,如果你用普通for循环呢,它最大的问题就是那个,它那个长度会变化,因为你取次它还变化,你这个不好确定。
11:08
说你取,每取一次你会发现你你你待会做一个很有意思的实验啊,你往里面放100个数据,你用for for循环,你会发现你只取出来了50个数据。为什么?因为你取一次长度减少一次,再取一次,再减少一次,其实你发现你只取出来五个数据,50个数据没有了啊,但是但是有些同学可以说,诶,怎么会是这长度不是100吗?结果你发现只取了50个数据,因为长度会变化啊,所以说一般来讲呢,我们用这个for便力啊,具体来说这样子的啊,在便利时如果China没有关闭,则会出现死锁,在便利所如果已经关闭,会正常的便利数据便利完后则退出这个便利,这个特别有用,这个我告诉大家这一点是特别特别有用的一个东西,因为这样子就可以达到一个。
12:00
这个用管道来解决一个通讯问题,就是我怎么知道你这一个携程做完事情了呢,我可以在那个携程干完事过后,我close一下这个,Close一下这个管道,然后我下面一句哦。我编辑出来,我死循环就出来,我就不死阻塞我的,我就知道等什么,等到什么时候我这问题就可以解决了,原先我等三秒五秒我不确定,现在我可以确定了,当你的携程把事情做完过后,你顺带把那个管道一关闭,我在那个主程序里面一看,哦,你退出了,我也就退出,好,待会我们再看效果啊来同学们,我们来演示一下这个遍历,同学们请看,现在呢,老师不啰嗦了啊,直接就拿这个来遍历好吧,来写看例。便利便利。便利这个管道。那便利管道呢,这样子啊,因为因为这个数据太少了,所以说我写稍微多一点。那同学们,我新建一个管道。这个是二里面呢,咱存放100个数据。
13:02
非常简单啊,非常简单,那么for循环I,注意听啊,同学们,I等于零,I小于100变成100次,I加加走。注意听CHINA2、往里面扔数据,往里面扔数据。注意这个箭头呢,你也可以空一下,但一般我不空啊,把它做一个整体,我便利多少呢?I乘以二,就说我把这个I乘以二放到这个管道里面去,那我的数据应该是这样子的,0248,最后是大家大家可以猜出来是多少,好好这个就自己自自己去想,那么这个就全部放进去了,放了100个数据进去。放入。放入。放入100个一啊,100个数据。100个数据到哪里呢?到这个这个管道管道。
14:03
好,那现在呢,我们想把它便利出来,现在便利啊,便利我们看第一种情况,如果我没有第一种方式啊,同学们看。可能同学会这样写,说老师我这样便利行不行?0I小于嫩,好,这个我告诉大家,我我不去演示了啊,如果你用这样的方式,你会发现,你会发现你一共取出来五十五十个数据没有了。因为每取一次这个论减一个,每取一个减一个,刚好取50个,这个同学们自己去玩。这个。这个地方以后不能用这种方式便利啊,因为因为这个是错的,那当然有些同学说是我就用这个容量变利行不行呢?也不行,因为这个容量也不一定代表它真实有多少个数据,所以说也不能用容量啊,说不这种方式就不要用,就是便利时不要使用。注意啊,便利管道时,便力管道不能使用普通的,普通的这个for循环。
15:05
或循环结构。循环要用什么呢?For each。啊,要这样写for。Four。然后呢,取的时候V。等于闰谁呢?T乘二。这个方法就是说相当于说我从这个管道里面依次取出这个值,当然取的时候也是先进先出,打印出来看一下。啊等啊等我把这个写出来取取什么。他他没有,他就返回一个值。它就返回一个值管道它就是返回一个值的,它没有啊。没有没有说这个一定返回两个,他就他这个返回的主要是由这个地方,它这个管道的结构来决定的,管道里面它没有这个所谓下标这个东西。
16:03
他没有下包啊,这就是为什么他取的时候,他不能说我跳过什么取,他必须得按顺序去。就管道队列,它的管道是本质是个队列吗?所以他不能说,诶,我我取的时候,我想取队列里面的第三个没有。也就他返回的时候也不会返回这个所谓的下标,明白意思吧,没有下标啊,说它返回的就返回一个是。没没有没有其他字,所以说你这样写它是没问题的,那我们来看看,这个时候呢,同学们看,如果我这样写呢,我我这样写啊,前提是我要先把这个管道关闭,如果你管道不关闭,你会发现他取的时候,他取到最后它它也是全部取完,取取取取取他把100个取完过后,他还傻乎乎的再去取,报错了,就是因为为什么呢?因为因为你没有关闭这个管道,你最后没有那个标志。好,他以为还可以学呢,就傻乎在这等,他一等等于九等等一等呢,发现好,这是一个实所好,所以说这种情况他是会怎么样呢?如果啊,把这个写到这里,如果在便利时没有关闭,会出现这个东西,但是数据确确实实全部取出来了,对,如果这个时候牵热管道没有关闭,则会则会出现。
17:15
则会会出现这个失错错误,但是数据确实全部取出来了,大家看一下。我再看一下啊走看代码。你看取到198的时候,其实已经全部取完了。你你想嘛,咱们是100,最后一个是99乘以二嘛,刚好是就198,但是但是取的时候他他很他很郁闷,他发现到最后那一集呢,取不出来了。好,这个时候应该怎么办呢?就是如果你要这种便利啊,同学们一定要记住关闭管道。一定要关闭这个管道啊,关闭这个管道,那么现在我们关闭管道。啊,关闭管道就没问题。啊,我把这句话写出来,如果关闭管闭管道会正正确的输出。
18:01
大家看代码。好,如果在便利时China已经关闭,则会正常的便利数据便利化退出,那这个时候关闭管道呢,非常简单,Close。Int。一个搞定。啊,搞定啊,注意同学们看,这个时候他就会把所有数据取出来,然后正常退出。好,同学们看效果就出来了,那这样子就告诉我们,将来我们想去知道哪一个携程把事干完的时候,咱们就可以用管道来搞定它,好这个是又一个知识点,我们把它写完,下面就来解决一个综合性的问题了,好把这个点我们就就今天结束啊,好,我把这个地方给它整理一下,我们讲了关闭。便利和他一个案码啊,案例同学们啊,来整理一下代码。我们讲了这么几个问题,一个是管道的关闭。啊,广州关闭前面已经讲讲过了啊,就这个就就不再多说,便利对便利。
19:01
讲了一个管道的便利。还有呢,就是他一个案例。好管道注意两个细节,第一个细节在这儿。对,在这儿。好,然后呢,我们这个代码呢,给同学们板书到笔记里面去,具体来说是这么一段代码。啊,就是遍历的时候,我是这么一段代码。核心点啊,讲的一个核心点就在这里。好的好的就说完了。好,这是关于China的便利和关闭,关于这个知识点,我们就先讲到这里。
我来说两句