00:00
接下来呢,咱们看一个案例,对吧,叫做线成按序交替对吧?那么这个呢,就是一道题,这道题呢,是一家知名的互联网公司14K起步的一道面试题,对吧,对吧,14K起步这道题做出来了,那就14K,做不出来那就8K是吧?后来啊,咱们试一下,那这个我们说这个叫什么呢?叫ABC来个交替打印,叫做alternate对吧,T nat对吧,Alternate说呢,说咱们先做一个稍微呃不一样一点,它数量打AABC交T啊对吧?那比如说咱们说什么呢?先把A打印五次,B打印15次,C打印叫做20次,然后呢,整个,然后是不是依此递归交替啊交替一共打这个,比如说打20遍可以吧,他让打十遍,咱们说打20遍呢,都一样的,对吧?那么这样的话呢,咱们就来一个,这个题叫做alle。
01:00
Al,那个叫做叫TM对吧?那么首先我们要清楚一点什么呢?现在ABC3个线程,那也是不是我得控制三个呀,让他们按序的打印,我是不是得对每一个线程都做到一个控制对吧?那首先呢,我们在这里维护一个变量,叫做int的number对吧?Number呢,初始值为,呃,让它等于几呢?等于一对吧,等于一,然后呢,这个它代表什么意思呢?就表示当前我正在操作那个线程的一个标记,对吧?表示叫做当前正在执行线程的标记,然后呢,我就来一个,首先我从开始循环呢,叫word,叫lo打印A的一个操作,那打印A的操作这里边首先有几个呢?我们说你要是访问不了数据,你是不是得对它进行控制啊,对吧,你要对它进行控制,要进行控制,你是不是得有锁啊,有锁了对吧,那叫做捞。
02:00
Box等于叫做new,一个train,对吧,Rere lock,然后control shift o,紧接着我既然要控制,那我们说三个线程,你要能实现这种按系交替,它说一定得有线程通信对吧?并且你有三个控制,所以说我们说通过lock得到线程通信的方式,那是不是获取condition呢?对吧,Soonn Di c Di,对吧,Condition,比如说来个CONDITION1等于look.new condition,那我要控制三个线程,是不是来三个condition,来个二,来个三,Ctrl shift o导一下包,对吧?导进来,导进来了以后呢,我们就开始进行操作吧,对吧?那首先别的不说了,我们说我们要lock,是不是来先来个上锁呀,叫做先来个枷锁,那么我们说你有这个枷锁是不是一定得有释放锁呀,对吧?所以说我们。
03:00
那先在这里来个释放锁的操作,来个叫做parent sta是来个finally啊,Finally先把这个锁释放了,不然的话是不是你有可能会产生问题啊,所以说以后用这个东西的时候,先养成释放锁的习惯,看懂吧,对吧?先来个释放锁,那么将来我们就可以开始写了,开始写我们需要一个什么呢?首先第一步我得判断,我得判断当前线程是执行这个线程的这个编号是不是一吧,对吧?我得看看这个标记是不是一,如果是一,我执行不是一,意味着是不是还没到我打印A的时候呢?那你就说先第一步,那你就是判断,那么怎么判断呢?那就来个if,如果我这个number要是不等于一,不等于一说明我当前线程我们说它不能执行,什么时候等于一,什么时候它才能打印A的淘派啊,那所以说它不等于一,它不能进行打印,那么它得等待对吧,那好了,那叫。
04:00
Condition in,点上condition in,点上wait是不是态啊对吧?那如果else,否则的话,那就说明它等于一吧,对吧?那那否则,那是不是就进来,进来就说明等于一啊,等于一,那是不是就执行打印头多对吧?打印多少次?我们说A我是不是打印五次啊对吧?为了方便大家看,咱们就从一开始让它小于等于五,在这里完成一个打印,叫做TH的,点上它的S,点该上name,拼上一个呃,拼上一个杠T吧,然后拼上一个I的值,就是打印的一共几次吧?从一开始什么这个A1打印一次,两次,三次,四次,五次,这个意思能看懂吧,然后呢,我再来一个吧,再来个什么呢?再来个表示,我们说这是第几轮,我们说循环20遍呢?我们说这是第几遍,我们是不是也给它做个标识啊,可以吧,对吧,你来个in的的,来个total的。
05:00
呃,Loop吧,来个total loop在这里呢,我刚替你拼上一个total loop,一会呢,我传过来表示这是进行到了第几轮的打印,听明白了,也就是说这几个变量的意思,第一个是不是先证明啊abcd呢,对吧,ABC对吧,先证明第二个说A打印了第一个A,第二个A,第三个第四个A,对吧对吧,然后呢,这是第几轮打印这个A,我们是不是一共得循循环十遍或者20遍呢?对吧对吧,是这个意思,那么这个是变量的意思,第三个我们说当A打印完了以后,那是不是就得交出去了呀,那交出那是是就得唤醒别人,让别人去哪了,对吧,那叫做第三步,那就是唤醒,首先唤醒我A打完了以后,我是不是把这个number变为二,意思是二,让二去执行这意思,意思是二让二去执行,那也就是说我得把叫做condition,二点上叫做single。
06:00
是不是唤醒一个,这次是不是只唤醒一个,你不能唤醒所有吧,对吧,说当N等于二,然后呢,让二进行打印。能用懂吗?那这样的话,我们这个操作也就搞定了,第一个那这是A是不是就完事了呀,对吧,A就完事,我们说这个total路op呢,就是表示叫做循环几轮对吧?第几轮的一个表示能搞定吗?那么相应的那我说不还有B和C呀,B和C是不是都一样对吧?那么再来个B和C,首先这个叫做lo b,那么首先要是第二,那是不是它是二呀,对吧?那如果它不等于二的话,那说明那二是不是就呀,对吧?然后呢,这个二呢,比如说我让它打印15字,然后打印名,打印I,这是不是没问题呀,那相应的,那这得变成二,打印完了是不是变成三,然后把三唤醒,是不是唤醒三啊对吧,唤醒三,那相应的下边这个也一样,首先这是B吧,那么过来啊C呀,是不C了呀,那不等于三,那么它不等于三的话,那么三就得是不。
07:10
等啊,因为不等于三是三,我才表示我的标记到了,我得打印对吧,那不能等于三,说明不是三,那我是三那个位的,那比如说三我让他打印多少次呢?打印24可以吧,那这里是不是其他图片呢?那这样的话三打印能该几了,是不是该一了呀?然后呢,让1.single,那是来了一个循环呢,对吧,来了一个循环,那这样的话ABC3个方法写好,那接下来我是不是启动对吧,线程是不是开始操作呀,对吧,那就来个main方法,叫做alternate DEMO ad了,等于又一个alternate DEMO对吧?那这样的话呢,我们说启动线程访问,然后是不是调用多少次啊,然后new一个thread在这里来呗,这咱们不是学过这个东西吗?然后呢,我起个它叫做什么呢?它叫做起个名,它叫做A线程对吧。
08:10
加star的认识不认识你经认么,累了对吧,实际上工作当中这大部分使用还可能还是这种方式比较多,那这样的话呢,我A来,我A是不是让它打印24啊对吧,它也从一开始,然后呢,它打印20次,然后调用ad.lo a把A传过去,相的线程有几个,还有个B吧,还有个C吧,这是不是B线程啊,这是C线程吧,那B线程就调用loop bc线程就调用loop c是这意思吧,对不对。是否定一个线程访问A方法,一个线程访问B方法,一个线程访问C方法分别访问20次。看看,那这个时候呢,为了大家看效果,我每次C打印完了之后呢,我画一个分割线,是不是表示一轮结束,然后打印第二遍,然后呢,第三遍等等右键右键运行。
09:12
注意看效果啊,那呃,这个是后边是19有点不太好,最后是不是19啊,这个看着啊,这是小于20是吧?对吧?你看小于等于20吧,那这是19次,实际上是不是也不太影响啊对吧,就是看着不好看,右键运行对吧?那这样的话是不是就是20次了对吧?那我们看看效果啊,首先看看我是不是A线程啊,打用了12345次了,这是第一轮对吧?这是第一轮,然后呢,A打印了是五次,然后B打印了15次了,对吧?后边这个都是轮数啊,C打印是不是20次对吧?那这是第一遍是不是结束了,刚是第二遍了吧,然后A打印五次,B打印15次,C打印20次,是不是好像这是第二遍吧,然后第三遍是不是A打印五次,B打印15次,以此类同啊,一共这种。
10:13
哦,轮学的方式打印了20遍,这是不是就撤回了对吧,对吧,那这就是得有线程通信是不是才能完成的呀,对吧,必须得有先程通信,那我说有些说说人家要求不要ABC吗?对吧?那咱们这个是不是比它更难点啊,对吧?ABC那就是意思,你A打印一次,B也打印一次,C也打印一次,是不是这意思啊,右键运行。搞定了没有啊,是不是搞定了ABCACA轮旋反应吧,对吧,循环着反应各大一次是不是搞定了对吧?那这就是叫做这个题对吧,叫做程线程交按序交替打印按序交替。
11:01
对吧,我们线程本身它的运行可能是对吧,抢占式无序,那我们要想对它控制,你是不是就得通过这种方式去控制啊,对吧,这里又用到了loop和condition,可是啊,F。
我来说两句