00:00
各位同学大家好,刚才内容中呢,给大家说明了什么叫线程监导定制化通信,包括把咱们要完成的例子给大家做了一个分析,咱们就是通过一个标志位来进行判断,包括完成这个过程,那咱们下面呢,就把咱们做这个例子,我们用代码来做一个最终的实现,那下面我们就来写一下这个相关的代码。那我在里边写一下,首先我在这个lock包里边呢,我先创建一个类,这个类比如说起名就叫做这个thread DEMO。三咱们来做一个创建。然后这个类创建之后呢,按照咱们之前说的多线程的编程步骤,那我们来做一下,首先里边的第一步。各位同学应该都记得,咱们是不是就是创建一个资源类,然后在里边呢,定义的属性,包括它的操作方法,那我们来写一下,比如写个class这个类,我给它起个名字,就叫这个share resource,就是共享资源。
01:18
把这个创建,然后创建之后呢,在里边定义它的属性,首先第一个属性,因为咱们要做这个叫线程间的定制化通信,咱们是不是通过一个标志位进行判断呀,所以第一个我就来定义,我们操作中这个叫标志位,把这个自定义,那我在下面写一下。我来一个private int,比如说我叫这个,咱们等于一。这个就代表咱的标志位,比如说一会儿咱们来约定,一的标志位代表我们的AA的这个线程,二的标志位代表咱们的BB这个线程,然后三的标志位代表我们的CC这个线程,用它做约定,这是咱们的第一个定义,然后这个定义之后,第二部分呢,咱们来创建这么一个lock的这么一个锁,就是一个瑞安的这个可重锁对象,那我们来创建。
02:20
Private,这个叫local。然后咱们起名叫local,等于new,上一个叫这个re安truck local,把这个做创建,这是咱的第二部分,然后创建之后呢,咱们创建三个condition,让它对应咱们的三个线程,也就是我这里边分析的,比如说第一个线程我们叫condition c1,第二个叫C2,第三个叫C3 C,咱们创建三个condition,也就好比说是三把钥匙完成咱们的操作。然后写一下创建三个condition。那现在我来做个创建,首先第一个private condition。
03:05
我们起名叫C1,等于用lock里面那个叫new condition,把这个创建,用同样方式,咱们再来创建C2和C3。那我这个我来快速写一下。这个是C2,这个是C3,所以现在咱们把三个condition就完成创建,然后创建之后呢,下面咱们写的那就是资源类中的操作方法。因为咱们约定我们有三个线程,第一个线程让它打印五次,第二个打印十次,第三个咱们让它打印15次,所以我下面我们就写上三个方法,分别实现我们里边的这个功能。那现在我来写一下。首先我们创建第一个方法。这个方法中让他就来打印这个。
04:00
五次,然后方法中呢,咱们可以传递一个参数,当然这个参数可以没有比,这个参数就指着我们那个,就是它那个是第几轮,比如我们是打印第一轮,第二轮还是第三轮,因为咱要进行多轮操作,那现在我写第一个方法。咱们来一个public we,比如说我叫这个PRINT5,代表打印五次,在里边传说笔当前是打印的,是第几轮的这个操作,那咱们传个值,这个值比如我叫这个。路跑啊,就是打印循环几轮,然后这个写完之后,里边就来做我们那个具体操作,那这操作之前咱们应该都写过类似的,那我下面快速写一下。首先第一步是不是先上锁,要上锁的话用lock里边这个方法。它就叫做log方法,然后下面我们写上一个try final这么一个结构。
05:00
在final里边加上这么一个释放锁,或者说叫解锁操作,用log里面这个方法叫按lo方法完成,这构建个操作,这就是我们的一个基本结构,然后结构写完之后,下面按照咱的操作步骤,第一步是建资源类定义属性方法,第二步咱们在这个操作方法中是不是进行判断干活,包括通知,所以咱下面进行咱们这个判断的操作。那我来判断一下啊,判断咱们为了防止虚假幻醒问题,需要写到咱们的while循环中进行循环特件判断,那这里边我来写一下,因为咱们现在是根据标志位做判断,咱的标志位叫flag,那我们来判断,如果说标志位它的值就是不是等于一,那咱们是不是就要进行等待呀,如果是一的话,那我们再往下执行,所以咱下面就要进行这么一个等待。
06:05
等待的话,咱们就用C里边这个叫a wait方法,咱们完成等待,这是咱们写的里边的第一个结构,然后这个过程中有异常,给它加上一个。Rose,这样的话,这个判断完成了,判断完成之后,下面步骤我们进行干活操作,如果说标志位是一,那咱是不是要给他打印五次,不是一我们就等待,所以咱下面进行干活就是打印五次,比如说我这里边我就循环五次,I等于一,I小于等于五,I加加,然后在里边直接自个输出,输出的过程中咱们把当前的。线程名称给它打印一下,就是里边这个叫get name。直接做一个打印,然后打印之后我把里边就是它这个就是循环这个值给到最终输出一下,那我们来输出。
07:09
比如现在这里边为了区分,我加个冒号,然后把这个I输出,并且输出当前它是第几轮的这个操作,因为咱们是不是有这个路的这个参数代表你是第几轮的这个操作,那我们来写一下。就是里边角的位置啊,它里面这个。轮的这个数。然后它是里边这个loop这个参数,所以现在我们就完成了这么一个基本操作,这就是干活过程,然后干活之后,咱下一步骤是不是要通知啊,就是你要通知下一个线程,那咱看怎么做啊,因为咱们做的是定制化操作,咱要通知是不是要通知BB这个线程,那咱怎么作,按照咱们的过程啊,因为咱们是用标志位做到的,所以咱们第一步先把标志位改成二,然后再去通知BB的这个线程。
08:07
那我来写一下啊,先改标志位。Flag值等于二,再通知BBBB咱是C2这个condition就咱用一个C2点这个C。进行通知,所以这样的话,把这个我们就完成了,加上一个注释,先修改标志位的值是二,然后再通知。咱们这个DB的这个线程,所以现在咱们把第一个方法完成了,就是打印五次的方法,这各位能做到,然后这个写完之后,下面在那完成打印十次,包括打印15次,这俩方法跟它应该基本上是类似的,那下面我把这方法给各位,我就快速写下。但下面写第二方法,打印十次。
09:01
参数还是我们这个。轮数就是你是第几轮这个操作现在写下啊,首先第一部分咱们肯定还是做一个上锁操作,漏点漏在下面加上一个try finally这么一个结构,在final里边做一个释放锁,或者说解锁操作,这个结构完成了,完成之后在里边首先还是咱的过程先做一个判断,咱们加上一个Y。大家注意,我们第二个打印十次是不是BB线程,BB线程如果标志位是二,咱是不是才打印,如果不是二,那我们就不进行打印,所以我判断如果它的值不等于二,那咱们就进行等待,就是C2。点上这个叫wa,如果它的是是二,那咱们就进行打印,也就是类似于这个结构,我把这个给各位直接拿过来,然后咱们让它循环十次,因为他要打印十次,然后这个做到之后,下面进行通知。
10:09
咱首先要先修改标志位。把这个标志位大家注意要改成几。是不是改成三有,因为咱们要通知CC这个线程,所以改成三,改成三之后通知CC线程。我写一下。CC线条,那怎么通知用这个C3点上这个C进行这么一个通知,所以现在打印十次方法咱们就完成了,完成之后最后我们再快速把这个打印15次方法,我用这个代码咱们快速改出来,因为结构都是一样的,这里边就是。15次,然后下面过程一样的,首先第一个大家去看啊,我这里边要判断,因为咱们CC线程标志位是三,所以咱这里边就是C3等待判断不等于三,等待等于三,我们就干活,干活的话让他就打印15次,然后最终再改标志位。
11:12
这改标志位,各位注意啊,比如说标志位,大家想一下要改成几。各位考虑一下,如果说我现在CC线程完成了打一,那下面是不是还要执行A线程,A线程标志位是不是一啊,所以咱们要把标志位改成值是不是一,最终在通知是咱这个叫A线程,也就是我们的C1的这么一个condition,所以现在这个就完成了,各位把这个能想清楚,咱们看一下啊,第一个是。C1,然后通知C2改标志位,然后这是C2通知C3改标志位,C3再通知C1并且改标志位,所以这样的话,咱就把这个资源类。
12:00
包括里边三个操作方法,我们就最终完成了,就是这么一个结构,然后都完成之后,最后呢,咱们就在这里边,我们加上这么一个问方法,然后完成它最终的测试。首先啊,把这类我们先创建share resource,等于new上一个share resource,下面咱们就创建三个线程,最终完成过程,那我来创建啊,New上一个在加上一个拉姆的表达式,在拉的表达式中,咱们完成这个操作,比如咱让他就进行这个十轮的这个处理啊,咱就循环这个十次。I等于一,I小于等于十循环齿轮,然后最终在里边调用share so中这个方法进行实现第一个线程,再让它打印这个五次,然后传入这个I的值,啊,这I就表示你循环这个多少轮,或者你的轮数。
13:05
有异常加上一个开这个位置,加上我们的线程名称,第一个线程叫AA,然后最终调这个大的方法,所以第一个线程就完成了,然后咱用同样的方式创建第二个线程,包括第三个线程,我把它快速复制一下。这个是第二个线程,我们叫BB。然后这里边打印是十次。这是第三个线程,咱们叫CC,然后这里边是打印15次,所以大家看目前呢,咱们这个线程间的定制化通信代码,我们就完成了,它最终的效果就是先执行A线程打印五次,在执行BB线程打印十次,最终再执行CC线程打印15次,里边会循环执行多轮操作,这里边我传了一个值。
14:04
所以咱们这个代码我就按照刚才给大家分析的过程,最终我们就写完了,要求各位要能理解这个实现的这个过程。然后这个写完之后,下面呢,咱们把这个代码我们最终来执行一下,看一下它最终的结果到底是怎么样的,那我们来执行一下啊。大家看它的效果啊,首先你看啊,咱从最开始看,因为我执行了十轮,首先你看第一次A线程是不是先执行的,然后它执行里边就是一到五是不是输错,这是第一轮,然后BB线程就是一到十。CC线程就是一到15。是不是都有了,这是第一轮我们执行的,然后你再看啊,A又执行第二轮轮数是二,也是一到五,BB是一到十,CC是一到15,第二轮包括第三轮,第四轮,第五轮一直我们执行了有。
15:03
施轮操作,所以现在这个效果我们就完成了,这个就叫作线程间的定制化通信,所以咱们最终按照咱们的过程完成了分析的这个代码。
我来说两句