00:01
各位同学大家好,刚才呢,我们通过的关键字实现了线程间通信代码,并且说明了里边这个虚假唤醒问题,那咱们下面呢,把相同的这个效果我们通过lock接口做个实现,那咱们看这个lock接口该怎么做这个效果,首先咱们先看一下这个API文档中,找一下在lock接口中对应的那个方法是什么。那我们找一下啊,来到Java u con这个log的这个包里边,找到里面这个log这个接口,然后在lock接口中,咱们往下看,首先咱看里面的第一个方法,这个方法叫new condition这个方法就表示返回LOCK11这个新的这么一个实例,然后在condition这个里边,它是一个接口,在里边有两个方法,咱们看一下啊,第一个方法叫什么?Wait,它就类似于我们刚才用那个wait的方法,处于一个等待状态,还有第二方法叫这个sign,或者叫sign o表示唤醒所有等待的线程,所以咱们下面用这个方法就来实现我们这个lock接口,实现这个线程间通信的这个代码。
01:19
那我下面给各位我来写一下,然后这个代码呢,首先为了明显,我把它就写到咱们的这个包中,这个log包,然后在log包里边呢,首先我先创建一个类,这个类我就叫RIDEMO,二把这个创建,然后创建之后还是咱们相同的步骤。首先,第一步。创建这么一个资源类。然后里边定义属性和操作的方法,那咱们来写一下,首先我来个class,然后里边加个名字,我们还是叫这个。
02:02
然后在share里边呢,首先第一个属性就是初始值是零的这么一个变量。咱们来一个private int number等于零,然后这个写完之后,下面咱们写上两个方法,一个方法是加一的方法,一个是减一的方法,那咱们来写一下,首先在写之前,因为它用的是这个lo这个接口,所以咱们把这个lock这个对象先做创建,就创建这个lo。那我写一下啊,Private,咱们来一个叫look。然后这个是lock,等于new上一个叫那个可重入锁叫re entra lo,那我写一下啊,Re entra log,呃,这个依赖我先引入。应该是Java u包中的,然后咱们new这个对象truck lock Ren。
03:00
啊re,这个unr look把这个创建,然后创建之后通过look里边的这个方法,咱们来new上一个叫这个condition,就是我刚才写的这么一个方法啊,那我直接扭一下啊,这个condition。Con咱们直接溜一下,然后溜完之后让它返回的是咱那个condition的这么一个对象,我把它快速写完啊,这个condition。咱们叫condition,等于lock里边new这个方法进行创建,所以这是我们的准备工作,然后创建之后下面写上这么两个操作方法,首先第一个方法,咱们来一个public with,我叫in瑞,就是加一,这里边就不要再加那个的关键字了,因为咱是用look方法进行实现,那这个方法不是各位是否记得啊,首先里边的第一步。
04:02
咱是不是先上锁,最后是不是在解锁,然后上锁的话,用lock里面的方法就叫lo,最终解锁,咱们放到这个try catch里边。加上一个搬到里,搬到里边做一个这个解锁的这个操作。然后这个解锁,用log里面这个叫unlo方法进行解锁,这是一个基本结构,然后写完结构之后,在TRY里边加上咱们说那个步骤,我写一下啊,就是判断。干活。包括做这个叫通知,那咱们来判断一下判断为了防止虚假唤醒问题,咱们写到这个while循环中,然后我们加一判断number值,如果说它不等于零,那我们就进行这么一个等待,然后它的等待通过condition里面这个方法。
05:04
我们来写一下这个方法叫away的方法,进行这么一个等待,然后它有异常,咱给它直接就是出去啊,这是一个等待,如果说现在它的值已经变成了这个零,那我们把这值就做一个加一操作,再来一个number加加,包括下面我们做一个就是输出。这里边我输出一下啊,这个输出代码我就到刚才那里边,咱们直接把它就复制过来了,就是里边的这个代码。这个我就直接拿过来。这是我们写的干活部分,然后最终我们在通知其他等待的线程,这里边用containt里边这个叫single no通知加线程,所以现在咱就把这个加一的方法,通过这个lock接口我们就快速完成了,各位把这个做到,然后这个写完之后,下面咱们再写一个这个减一的这个方法。
06:03
那我来完成一下啊,咱们来一个public with,我叫。然后在里边同样先对它做一个上锁操作,就是lock,里边这个叫lock方法。做一个上锁,上锁之后把它写到一个try catch finally里啊,主要是try finally里,里边做一个解锁操作,按log,然后在里边还是用到我们的过程判断,干活通知那咱判断。就是这里边如果说你的number值它不是一,那咱们肯定要进行这么一个等待操作,Condition里边这个叫a wait方法进行等待。这里边有异常,咱给它直接得就出去,如果它的值是一,那我们进行干活,用number进行减一的操作,下面再进行这么一个输出,最终再通知其他的这个线程,我们用一个叫新的,所以现在这个加一和减一的两个操作方法,咱们现在就快速完成了,通过lock接口最终做的一个实现。
07:19
各位法律知道啊,上锁解锁等待,还有通知。然后这些都完成之后,最后咱在里边就做一下最终的这个调用,那我们来调一下啊,我先来一个问方法。然后把这个事这个类给它创建一下。等于new上一个,这样下面创建这么多个线程,咱们来做个测试。上一个。加上这个拉姆的表达式,比如在里边让它就循环这么十次。
08:00
I等一,I小于等于十,然后在里边调用share里边先调这个音可瑞加一的方法,有异常加个垂,最终加上我们那个线成的名称,比如叫A,然后这里边别忘记点上一个散的方法,这是第一个线程,那比如说我们再加上第二个线程,这个线程名字咱们叫BB。在这里边调用它那个减一的方法,第一可,所以现在这两个线程我们就完成创建,然后创建之后我们再复制两个线程,咱们还是用四个线程进行这个测试。比如说里边的第三个我们叫CC,第四个叫BD。现在代码就完成了,这是我们用lock接口做的实现。代码写完之后,下面呢,咱就把它最终来测试一下,看一下最的结果怎么样,大家看啊,一个线程加一,一个减一,一个加一,一个减一,最终咱们想得到的是不是就是这个效果,所以这是关于我们说这个线程间的通信,咱们用这个这个ne的关键字,包括用这个lo接口分别做了实现。在这过程中大家特别注意这么两点,第一点就是咱们多线程的编程的四步操作,我快速重复一遍啊,第一步就是建资源类,包括属性方法,第二步在方法中判断干活通知。
09:37
第三步,创建多个线程调用资源内容方法,第四步,防止虚假破解问题,然后这里边不管是这个那的方式还是lock方式,各位把它都进行掌握。另外注意虚假唤醒问题,咱们需要把这个判断条件写到Y循环中进行这个操作。这是我们演示出来的线程间通信的这个切换代码。
我来说两句