00:01
各位同学大家好,欢迎继续收看doc高并发编程,刚才呢,我们完成了doc中的第二个辅助类循环栅栏的这么一个使用,那下面呢,我们来说一下doc里边的第三个辅助类叫做信号灯S,然后咱们来说它该怎么进行使用。那首先咱们先通过API文档找到这个第三个辅助类叫做或者叫信号灯。然后咱们看一下这个类的一个基本的描述,这里写到它是一个计数的信号量,从概念上讲,信号量维护了一个叫许可级,什么叫许可级?你可以理解为我这里边有很多的许可证,然后它有多个,就是一个许可级,如果有必要的话,在许可可用前。会阻塞每一个这个A块D,然后然后再获取蓄口,而每个release会添加一个蓄口,从而可能释放一个正在阻塞的获取轴,这是它一个描述,而这句话什么意思呢?比如现在我在S缝里边,它里边有第一个方法,这个方法叫做A块,A块表示就是获取到一个许可,而它在获取之后,那别的线程将一直处一个阻塞状态,或者说一直在等待,而当这个许可用完之后,他把许可做一个叫release,是不是叫释放?
01:31
释放一个许可,而它释放之后,那其他正在阻塞的线程会被唤醒,然后实现它的下操作,所以这个就是关于我们说这个信号灯的这么一个类信号,那下面呢,咱通过这个类我们来实际用一个例子来演示一下这个过程我们到底该怎么去做,那下面给各位来说一下,那现在我来实现这么一个例子。假如说咱们来实现啊,就是现在我有这么六辆汽车。
02:02
然后咱们让六辆汽车呢,停在这个就是三个停车位里边,就是六辆汽车停三个停车位的一个过程。咱用这个来演出这个信号灯的这个例子,那这个怎么做,咱们看一下A篇文档中,找一下里面的方法,首先各位看,在S里边呢,有它的构造方法。然后在构造方法中可以传入它相关的这些参数,那我们来仔细看一下它的这些方法。在它的构造中呢,有个参数,这个参数值你可以理解为就是它的许可的数量,比如说咱们现在有三个车位,那三个车位是不是就是我们许可这个数量,然后下面还有两个方法,一个叫A块,一个叫release a块理解为就是获取到一个蓄口,比如说我现在我把车停到了停车位里面去,那我停完之后别的车是不能停的,那这就叫获取一个蓄口。
03:04
然后下面还有一个方法叫这个release release表示释放一个吸口。比如现在我把车从停车位开出去了,那我停车位是不是空了,别的车是不是能进来了,这就叫做释放一个许可,所以在里边我们主要用到就是它的这几个方法,那下面咱把这个例子,我们用代码咱们实际来写一下,完成里面这个功能。那现在我来做一下。首先在里边我先建个类叫这个CDEMO,把这个创建。在里边,咱就来模拟这个就是六辆汽车。它停到这个三个停车位的这个过程,那咱们来写一下,首先我在里边先写上一个问方法,然后问方法中咱的第一步操作,创建一个c four的这么一个对象,在对象中设置一下它那个许可的一个数量,因为咱们是三个停车位,所以它的数量就是三,那我来写一下这个S缝。
04:10
等于谬上一个S缝里边穿个参数,咱们传个三表示三个去口,然后这个事之后,咱的第二部分,咱就来模拟这个六辆汽车。然后这个六辆汽车呢,咱就创建六个线程,然后来实现里边那个占车位,包括离开收位的过程,那我现在在里边,比如说我先循环六次,I等于一,I小于等于六,循环六次,在里边创建这个线程,咱们溜上一个straight,里边加上这么一个。电阻函数在里边实现,首先因为咱们比如说现在我六辆汽车都进入到我停车场中,而最终停的话,是不是只能有三辆车停到车位中去,另外三辆车是不是只能等待呀?但是这过程可能会依次执行,比如说我第一辆车停进去,第二辆车等待,第三辆车停第四辆车等等的过程,所以咱们就自个模拟,那怎么模拟,首先第一部分。
05:17
比如现在我这辆车首先是不是先抢占这个车位,就是先占上这个车位,比如我们叫抢占,那咱调这个四份里面这个方法叫做A块,表示抢到我这个车位。现在有异常,咱们加上一个,然后他抢到车位之后,这里边啊,比如说咱为了效果明显,我在下面就我输出,就我输出一下是哪辆车抢到了这个车位,咱就把当前的线程名称输出一下threat,看到threat点。然后后面加上一个提示啊,比如这辆车它。抢到了这个。
06:00
车位,这是我们做的输出,然后他抢到车位之后,车肯定停到了停车位里面去,但是这个车不可能一直停到边去吧,它里边肯定有个时间,比如说可能是一分钟,可能一天或者多长时间,所以咱们这里边为了咱们效果明显,我就设置一下这个随机的一个停车时间,这时间不确定,那咱怎么设置呢?我就通过里边这个方法,咱用这个time。Union里边我加上一个给这个second秒,然后后面加上一个叫sleep sleep说是它这个秒的数量,然后这个秒咱为了更加明显,我通过random,咱们来随机生成它的这么一个值,比如咱们通过这个。Ne这个里边加个五,生成五以内的这么一个数量,让它随机设置停车时间,然后设置之后,最后比如说我们再做个输出,当这个停车时间到了之后,那这车是不是要离开这个车位,这里边我写一下,比如这个车。
07:06
就是离开了这个。车位,所以现在这个过程做这个说明,然后咱为了明显,我在里边加一些特殊符号,为了一会儿看到更清楚,所以现在这个过程完成了,然后完成之后呢,下面我们再加上一个关键字叫final里,因为咱们的这个方法是不是表示获取到咱的许可,而你这个车听完之后,最终咱是不是要做个释放了,所以咱们把这释放我就写到BY到里边。用这个这份里边这个叫release方法,我们来做一个示范,这样的话,这个结构我们就完成了,完成之后在里边我加上这个现成的这个名称啊,咱们再一个I,然后最终调用此大的方法把这个最终做到,所以现在这个例子我们就完成了,通过模拟出来这个六辆车停到三个停车位过程,咱就通过这个过程把这个最终实现。
08:09
然后这个代码我们可以再看一下这里边的实验的过程,第一步我们就是创建一个损份这个对象,设置你的许可这么一个数量,因为咱们是三个车位,所以我的许可数量就是三,第二部分我循环了六次,创建六个线程,在每个线程中都实现抢占车位,然后释放这个许可,包括中间我们随机设置一个停车时间,包括每次都输出抢到车位,包括离开车位。所以现在这个。信号灯这个辅助类的使用,我们通过这个例子就完成了代码编写,那下面咱们把代码执行一下,看一下最终的效果到底是怎么样的。那现在我把它执行一下,然后咱们看一下里边的结果。
09:03
啊,大家注意啊,因为这结果它的时间是随机的,然后咱们从上往下看,首先六辆汽车进入到停车场中,第一次有第一辆车,第二个车和第四个车都抢到了车位,然后剩下第三个,第五个包,第六个应该都等待,然后现在比如说第二辆车先离开了,他离开之后三的车是不是抢到了,然后四离开了,四离开之后五抢到了,然后这个五,比如他离开了,然后六抢到了,然后之后第三个,第一个,第六个一次都离开了车位,所以咱现在把这个效果咱就做这个模拟,通过信号灯这个辅助类实验出来这个六辆汽车停到三个停车位过程。所以各位把这过程给它知道,这里边主要是三个部分。第一部分,通过构造创建你的许可的数量。
10:00
然后第二部分通过这个饵块呢,就是获取到许可。它在获取之后,别的线程只能一直阻塞或者说等待状态。然后它获取之后,最后我们要进行释放,释放之后别的进行等待线程被唤醒,然后他们再继续抢这个车位,所以现在这个例子我们就完成了,也就是到这里为止呢,咱就把doc中三个强大的辅助类这个位就都说完了,第一个叫减少计数,咱们写的例子各位应该记得啊,就刚才写到的第一个就是。六个同学都离开教室之后,班长才锁门,然后第二个叫做循环栅栏,咱们的例子就是。集齐七颗龙珠可以召唤神龙,然后第三个叫信号灯,就是咱们刚才的例子,六辆车停到三个停车位的过程,所以现在三个辅助类给各位就说完了,各位掌握三个辅助类的特点,包括咱们例子中代码的编写过程。
我来说两句