00:01
各位同学大家好,下面呢,我们继续来学习GUC高并发编程,下面给大家讲解一下GUUC里边强大的辅助类,咱们学习三个辅助类,第一个介绍技术,第二个聚算栅栏,第三个降灯。通过这三个辅助类,咱们在特定场景中能够快速实现我们的功能,那下面我们就来具体说一下这三个辅助类的具体使用过程。首先我们看第一个辅助类叫做减少计数,它的类的名字叫做countdown lunchnch,那这个辅助类咱们通过API文档我们先看一下。首先咱们找到啊,在Java u car包里边找到这个类count到lunch,然后这个类里边呢,有两个方法是咱们一会儿用到的啊,具体说是三个方法,第一个是它的构造方法,在构造中传入一个初始值,第二个叫为让当前线程等待或者说阻侧,第三个叫C大,把你的计数让它减一,所以这是我们一会用的三个方法。
01:11
那这个减少计数到底是一个怎样一个过程,下面给各位来说一下,首先咱们看一下我的文档中,我这里写到countdown lunch池内可以设置一个计数器,或者说是一个初始值,那咱通过它的这个有参构造来个值。比如说我现在设置这个初始值。假如说值我们设置成是六,这是我们的第一步,然后设置之后呢,咱后面可以通过这个叫countdown方法,让这值每次都点一。就是咱们的这个方法叫countdown方法,然后用countdown方法可以让咱这个初始值每次都做个简易操作,比如它变成了五,变成四,变成三,变成二,这个叫减一啊,而这个时候呢,这里边还一个操作叫这个a wait方法,那a wait什么意思呢?给大家强调啊,比如说咱们最终啊,我想做个操作,当我这初始值变成零之后啊,就是变成这个零之后,那咱会输出这么一段话,而它没有变成零的时候,这段话就不做输出,所以咱们当这个初始值没有变成零的时候,咱会一直掉个方法,这方法叫做a wait方法,表示等待,等待它变成零之后,这段话才输出,当它没有变成零的时候,我们会一直做这个a wait,就是一个等待的这么一个操作。
02:46
所以这是关于咱说这个countdown lunch,也就是说我每次调countdown方法,这个值都会减一,它变成五,变成四,变成三,当这值不是零的时候,我最后输出这个线程会一直等待,当这个值变成零之后,那我才执行wait后面这个方法,也就是把这段话做个输出。
03:09
也就是这里边描述的一个过程,这里写到countdown lunch中两个方法,一个是调用OA的方法,它会让这些线程阻塞,一个是调用countrdown方法,让你计数器减一,然后这个时候调countdown方法,这个线程不会阻塞。当这个值变成零之后,那额外的方法阻侧线程会被唤醒,然后会继续执行。这是关于叫counter,当lunch减少计数。那这个原理说完之后,下面呢,咱就通过一个具体例子给大家来详细用代码演示一下这个减少计数该怎么做,然后咱们就写这个例子。给大家拿回来啊,比如咱们现在在一个教室中,咱们有六个同学,比如六个同学呢,都在上自习,那这时候比如说我做个操作,当六个同学呢陆续离开教室之后,那这个时候我们这个就是比如说咱叫班长才可以关门,或者才可以锁门。
04:12
这是我们要完成的例子,比如现在教室中有六个同学都在上自习,等六个同学陆陆续续都离开之后,班长是不是才能最终锁没有,而六个同学中有一个同学没有离开,那班长是不是要一直进行一个等待的状态,所以这时我们要实现一个例子,这个例子咱就通过里边那个就是康当lunch尺,最终把它做到六个同学陆续离开之后,咱们班长才可以锁门。那我下面把这个例子给各位,我们就来具体写一下,来看这个该怎么去做。那我来实现一下啊,首先我在这里边,比如咱们啊,首先我先建个包,这个包呢,咱们给它起个名字,我就叫这个。
05:01
Doc啊,表示它的复类,然后在doc里边,咱们首先创建一个类,这个类比如我起个名字,去掉这个countdown lunch这个DEMO。这个类创建,然后创建类之后,下面呢,我们来写一下这个具体的代码,首先我加个注释啊,就是演示这个count lunch这个操作,六个同学都离开教室之后,然后班长才可以做这个锁门操作。呃,这个类的名字,然后改一下啊,刚才少复制一个字母。给它改一下,我们叫countdown lunch DEMO。啊,改一下啊。然后这个写完之后,下面呢,我在里边咱就直接加上这么一个问方法,然后在问方法中把这过程我们来做个实现,那这过程呢,给各位我这么来演示啊,首先我先写个代码,这个代码呢,比如说我们先不加上countdown lunch示,咱们先做一个六个同学离开之后,班长才可以锁门,那咱们看它会有什么效果啊,那我来写一下啊,就这么一个基本例子,咱先不加这个抗lunch,就是六个同学。
06:16
陆续。离开教室之后,然后班长才可以锁门,那咱们举个例子啊,首先第一个咱先做这个,六个同学他陆续离开教室。各位注意啊,六个同学谁先谁后不一定吧,可能他们一起离开,也可能这个先这个后,他们的时间都是不确定的,所以咱怎么做呢?我在里边我就创建六个线程,模拟六个同学,那咱就写一个不循环,里边循环六次,I等于一,I小于等于6I加加,然后在里边创建线程上一个。
07:00
Thread。在里边咱就直接加上一个拉姆的表达式,在里边我们来创建这个线程,比如说咱们首先做一个输出啊,输出的时候呢,就把这个线程名称输出。点这个叫做current。Thread。点上这个叫get name,然后后面加上输出比我们约定啊,说这个啊,比如这个号同学,比如一号同学,二号同学他离开了这个。教室啊,咱们做这输出,然后输出之后下面呢,加上这个线程名称,咱就用这个I的这个值作为我们的线成名称,那我们加上一个string.value off,加上一个I在调用里面这个大的方法,所以大家看这一段代什码,咱们是不是就完成了里面的过程,模拟了六个同学的效果,咱是创建六个线程,然后这里面输出你线程的名字,就是咱是一号同学,二号同学,三号同学等等。
08:08
然后这个做完之后,最后我在这里边循环,外边我在做输出,这个输出我们写一下,说这个班长就是锁门走人了,因为六个同学都离开之后,那班长就可以锁门了,那这里边比如说我现在做输出,我也把当前的线程名称输出一下。然后这里边写一下。就是这个班长。锁门。走人了,所以现在咱们就完成了一个最基本的一个例子,这个例子中我们目前并没有加上countdown lunch,那我现在把它执行一下,咱们来看一下目前会有什么效果。各位同学也可以想一下啊,我们这么执行他可能会出现什么问题呢?那咱们执行一下,我一边执行大家一边来想一下问题会出现什么。
09:01
比如说大家看啊,这问题就出来了,我一号,六号,五号同学都离开了,那这个时候班长是不是锁门了,而他锁门之后你发现啊,三号,二号,四号同学是不是被关到教室中了,他是不是就出去了啊,当然他可能跳窗户,比如他在十楼,那怎么跳窗户,是不是也没法跳窗户,所以这个时候这效果就不对了。正确效果应该怎么样?一到六号同学都离开之后,班长是不是还锁为啊,但是现在我这么写,这效果是不对啊,他可能造成我班长先走了,然后把某些同学就锁在了教室中,然后你看啊,一到六是在六线程,最终班长是不是这个问的这个主方法的线程,所以最终啊,目前咱们看到这个问题,就是可能造成人没有走,但是班长已经锁门了。这是我们写的这么一个例子,同时也把问题念出来了,当然这个我们要解决的话,怎么做呢?首先咱就可以用到我们现在说这个countdown lunch这个辅助类,用它就可以快速把这功能实现,那咱们看这个该怎么做,给大家写过程啊。
10:16
首先第一部分咱们就是创建一个countdown lunch这么一个对象,里边设置一下你这个初始值。然后咱们来创建,我加上一个叫countdown lunch。引入依赖。等于谬上一个,看lunch里边加上你的初始值,因为咱们是六个同学嘛,所以我加上一个六,这就是我们的第一步。设置你这个减少计数的初始值,这步我们就完成了。这个完成之后呢,咱们继续往下来做,因为这个是一个初始值,而每次我有一个学生离开之后,这个初始值是不是要一啊,因为咱们是一个计数器效果最下面我来写一下,就让这个计数器它里面的值每次离开之后要减一,那怎么做?咱们调这个countdown lunch面这个方法就叫做countdown方法,这个方法表示每次让计数器的值点一,然后减一之后咱们继续往下做,因为我们现在在这过程中,如果说初始值没有变成零,咱是不是就一直等待呀,或者一直在睡啊,所以现在我们就做这个等待,或者说阻侧操作,我们用countdown lunch里边这个叫away方法进行这么一个等待。
11:46
里边有一长加上一个。Rose啊,给它直接走入出去,所以现在这个代码就完成了,然后咱们看一下,最终来执行一下啊,首先设置初始值是六,每个同学离开之后,让初始值计数器减一,当它的值没有变成零的时候,咱们就一直等待,当计数器变成零之后,我们就执行a wait等待之后这个代码,所以现在用countdown lunch就完成了一个减少计数这个操作,也就是咱们这个例子,六个同学都离开教室之后,班长才可以锁门。
12:26
那我现在把这个代码执行一下,咱们看一下最终的效果怎么样。大家看啊。123456是不是都离开了,最终班长锁门,比如说我们再进行一次。是不是这个效果,比如说我们可以再来一次。大家看啊,因为哪个同学先离开肯定是不确定的,不管你是二号也好,一号也好,肯定要这些同学都离开之后,最终班长是不是才锁门走人。所以现在通过这个例子,咱们就完成了减少计数看档lunch这个使用,各位记住它的过程,第一步定义初始值,然后第二部分。
13:07
每个操作之后让计数器减一,最终我们实现,如果说计数器的值没有变成零,咱就一直away,等它变成零之后,那wait后面带什么,它才会进行执行,所以这样的话,第一个类comedown lunch给各位就最终也是完成了。
我来说两句