00:00
各位同学大家好,下面呢我们继续来学习包注分支合并框架,刚才呢给各位做了一个总体介绍,那下面呢,咱们通过一个具体的例子来实现一个分支合并框架这个效果。那咱们看我们该怎么做,首先我说一下我们要做什么例子,咱们的例子呢?还是刚才我们说的例子,比如现在我想实现就是从一加二加三加四一直加到100的过程,通过它来用分支合并框架把这做到,那咱们要怎么做呢?我说一下我们的实现过程。因为咱们做相加,最终加的是不是两个数的相加呀,所以咱们做约定,我们现在就是让我这个。相加的两个数,咱们让它有个要求。什么要求呢?让两数它们的差值不能超过这个十。
01:03
也就是说我现在啊,两个数相加,那两个数的这个差值不能超过十,什么意思呢?比如现在我两值一个是十,一个是20,它们的差值是不是十啊,当你这个差值不超过十,它能相加,当然比如说我现在我用十加50,它们的差值是不是40啊?那这种效果咱就不能让它相加,需要对它做拆分,当我们拆成差值不超过十的时候,才能进行相加,所以这是我们要做的效果,也就是说咱要实现一加到100的过程中,让你两数相加,它们的差值不超过十,只有这个时候才加,如果超过十的话,那我们就进行拆分。这是我们的实验方式,那这个拆分怎么做呢?有很多方式,而咱们目前呢,采用这种方式来拆分,我来说一下啊,比如大家注意我一到100是不是有100个数啊,那咱这里边是不是有个中间值啊,比如说我约定啊,我这里边就是一。
02:12
一直到这个50是咱的第一部分,然后我现在从这个五十一一直到这个100是咱的第二部分,就是咱们取这两数的中间值,根据它做拆分,这是它的左边部分,这是它的右边部分,然后左边部分一到50过程中我再进一步拆分,比如这里边一到50,它的这个中间值是不是应该是这个一,比如到这个。25,然后后面只是这个26~50,咱是不是拆分,这个过程中咱们再判断,如果说它们的差值大于十,那咱们再继续拆分,比如这个一到25,那它里面范围就是是不是这个一。比如到这个12,然后后面是这个13,比如到这个25,是不是这个过程,所以咱们现在用这种方式就个拆分,最终让它实现一加到100,而两个相加数的差值让它们不能超过十,就是取它的中间值,左边部分拆右边部分在进步来拆分,咱们就是这么一个过程,而这个过程呢,在咱们的算法中一个描述,它叫做二分查找,或者说二分操作这个过程,所以咱们现在就用它来实现咱们这个最基本的一个拆分过程。
03:39
这各位给他先知道,那下面呢,咱就把这过程通过代码方式来做实现,实现一个从一加到100,只是他们中间要做拆分,让你相加两值的差值不超过十,超过十的话,那咱就进一步进行拆分,然后拆分方式用这种二分查找的方式,最终做到就是取中间值,然后左边部分拆右边部分进一步来拆分。
04:08
这是我们做的这么一个分析,那下面呢,咱就把这个代码我们最终做实现。我们来看一下啊,首先我现在呢,在这个包里边,我现在创建一个包,这个包我起个名字就叫做fork座椅。然后创建之后,在Bo作引中,咱们首先建个类。Fork作。DEMO把这类创建,然后创建类之后呢,下面咱们用这个分支合并框架来做操作,按照咱们刚才在API中看的过程,其实就是里边的。这么一个结构在里边,咱们继承这个叫receive task,然后在里边实现咱们的拆分过程,包括folk是拆分作因式合并,那咱们下面把代码我们来写一下啊,首先我在里边我就来创建一个类,这个类我起个名字,比如叫这个my task。
05:10
让这个类呢,继承一个类,就是咱们刚才看到的这个类,Receive task。里边加上泛型,咱们来一个in提,这是我们写的这么一个类,然后写完之后在里边写上它相关的方法,这里边呢,要求咱们必须实现一个方法,这个方法comp,然后里边实现你的逻逻辑,那家看怎么做啊,首先在里边呢,咱为了方便先创建几个变量,包括固定值。比如说咱们创建第一个,因为咱们要求啊,就是我们拆分的时候。它里面那个差值是不能超过十啊,就是咱们只计算十以内的这个操作,那咱们写上这么一个值,然后写下啊,比如来一个private,我们就来一个固定值,因为它是固定的static final,然后咱们来一个inte,这里边我起个名字,比如叫这个。
06:13
呃,就叫这个。Y6吧,啊,Y6这个值我们等于十,就表示你拆分那个就是计算十以内的一个操作,因为咱们是让它不能超过十啊,就是计算十以内的这个运算。这里写下啊。十以内的这个预算。所以现在把第一个固定值写出来了,然后写完之后咱们继续往下看,因为咱们拆分用的是一种二分查找方式,肯定有它的开始值,有它的结束值,比如这个场景,比如这个开始值是一,结束值是50,根据它做拆分,我这里边开始是51,结束是100,所以咱们定义两个变量。
07:01
我写一下啊,第一个变量我们叫这个begin吧,代表我们那个拆分的开始值。这是一个,然后咱们再来一个private int,我叫and,这个代表咱们拆分那个就是结束的这个值,另外咱们再来个变量表示它最终那个结果我们就叫。Result就是你最终返回的一个结果,所以现在把这个固定值和三个变量都写出来了,然后写完之后按照他这个文档中的写法,大家看这行代码。这是什么?是不是它一个有参构造里边设置你这些值,所以咱们现在我们也是创建一个有参数的构造,那我们来创建啊,咱们来一个public,这个叫。买task。这个啊,My task。
08:04
然后在买它的中呢,加上它的参数,它的参数咱就写这个开始值和结数值,因为要根据它做一个拆分啊,这是begin,这是and,然后下面做个赋值,这次点begin等于这个begin,这个传过来参数,然后这次点and等于咱们传过来这个and,这个参数就开始和结数,现在把这个就完成了,然后完成之后下面呢,咱们在这个complete方法里边来实现我们最终那个拆分的这个逻辑。或者说拆分和合并的这个过程,那咱们最终把这个我们来写一下啊,咱们看这个该。怎么去做?我们来做个实现,首先第一部分呢,咱们先做个判断,注意啊,判断什么呢?就是现在如果说你这个就是两个要进行相加操作的值,它的差如果说小于等于十,那咱是不是就直接相加呀,如果说它大于十,咱是不是再做拆分啊,就做个判断,判断你相加的这个两个数。
09:18
它的值是否大于这个十,如果说大于十,咱拆,如果说小于等于十,那我们就直接做相加,那咱们来判断一下啊,首先我加上这么一个if判断。If里边写下。现在我们是。两个值嘛,因为咱们有and和比begin,所以咱们怎么做,是不是and减上比begin,如果这个值它小于等于咱们那个十,就是这个Y6,刚才咱写了一个常量固定值,那这个时候表示它的结果就小于等于十,咱就直接做这个。相加的这个操作,然后再加上一个else else表示它的值大于十,如果大于十的话,那我们就进一步进行这个拆分啊,就是进一步做拆分,所以现在这个过程,那我们做一下啊,首先如果小于等于十,咱这一相加,因为相加的话呢,它里面有很多数据,所以咱就直接来一个负循环,给它加一下就可以了,那我写一下啊,就是。
10:25
Int I等于这个应该是那个begin开始值,然后这里写到I小于等于它的结数值,最终做相加,咱们用这个result,就是等于这个result加上这个I。最终是不是做了一个降价操作啊,这是我们写的第一部分。然后第二部分,如果说它的差值就是大于十,那咱们就进一步进行拆分,那拆分怎么做,给各位写一下啊,首先按照咱这个刚才说的流程,是不是先找它的中间值,然后把左边部分拆,再把右边部分进行拆分,比如咱的100中间值是50,那我左边部分一到50,右边部分51~100,那咱下面来做个操作,我写一下啊,首先。
11:18
获取到你那个数据那个。重电池。那咱看怎么做啊,比如来一个名字,咱就那个middle中间吧。Be的等于这个就是写一下啊,就是begin加上and除以二得到是不是中间值啊,然后得到中间值后,咱们先拆分它的左边部分。再来拆分它的右边部分,那我们来拆分啊,拆分怎么做呢?看它文档中就是这个写法。是不是就是还是new这个对象用这种递归方式把这做到,那咱写一下啊,首先来一个买task。
12:00
比如咱起个名字叫这个TASK01吧,等于new上一个买task在里边咱们传入它那个参数,写下啊买task,然后它的参数由你的开始位置,还有结束,结束就是咱那个middle。这各位应该能想明白啊,比如咱们一到100,中间值是50,那我左边部分就是一到50,这是左边拆分,然后咱们再拆分右边部分,我们起个名字叫TASK02。然后大家想一下啊,你说右边部分要怎么写。咱们左边是一到50,右边是51~100啊,所以咱就来一个咪。是不是加一啊,再加上你的按的这个结束的这个值,所以现在左右咱们都扭出来了,扭完之后我们做这个拆分,首先TASK01点上fork,然后TASK02点上fork,这样的话把这个拆分过程我们就完成了。
13:08
写一下啊,就是调用方法拆分,然后拆分之后,最终咱们把拆分之后的结果是不是要做一个合并,就合并你的结果,那咱们来合并一下啊,咱看怎么做,我加上一个这个result。然后result等于这个TASK01。点上这个叫作业,再加上这个task的零二点上作业,这样的话,通过作业方法把你两个子任务是不是最终做了合并,然后最后咱们把这个result做一个返回,所以现在这个拆分和合并的过程咱们就最终完成了,就是里边的这个过程。然后这过程给各位再说一遍啊,最终咱们在里边再做测试。
14:00
然后大家看,首先我写个类继承,Receive探测是在文档中要求的,然后继承之后里边有几个固定值,包括变量在构造中传入你要拆分的两值开始和结束,比如说一到100,然后这个选完之后,下面就是逻辑拆分中,咱们先做判断,如果说你相加两值的这个差值是。小于等于十的,咱们就是直接做相加,如果说你拆分的差值大于十,那咱们进一步拆分,先取中间值,然后拆它左边部分,再拆右边部分,最终把左右两部分做一个合并拆分用报方法。何必咱们用作用方法最终把它进行返回,所以现在这个过程就完成了,完成之后最后咱们在这类里边,我们做一个最终的这个测试,看一下最后的效果啊。
15:01
那我们看怎么做啊,首先第一个咱们先创建那个,就是我那个拆分任务这个对象先创建一下,咱们写一下啊my task。等于妞上一个买pass,咱要实现就是一到100嘛,咱就写个零到100啊这么一个结果。现在第一步把对象创建,然后创建对象之后,下面呢,咱们要开始做这个操作,那操作怎么做呢?首先在里边咱就要创建一个分支。合并这么一个池对象,就刚才咱们看那个叫fork join pull这个对象。然后写一下啊,Book Joy这个对象。把它咱们先扭一下,通过池对象完成咱们的内容,然后池对象创建之后,下面咱就调用池对象里边的一个方法,这方法就叫做submit方法,里边加上咱们那个就是拆分那个任务。
16:03
然后最终啊,它会返回一个叫fork join这个task,我给它起个名字啊,就是fork join。现在这个就完成了,然后完成之后呢,现在我们最终可以通过里边的方法获取到你最终就是合并之后的那个结果,那我们得到一下啊,Fork join task里面那个方法叫get,能得到你最终那个合并之后那个结果啊,比如我们叫轨道。然后把这个result做一个输出result。这是我们写到的啊,这里面有异常OB巴异常加上一个roses啊,给它指入出去,然后这样的话就完成了,完成之后因为咱们用到了这个分支合并的齿对项,最后要关闭你这个齿对项。我们做一个关闭。
17:01
我们写一下啊,Fork join,破点上这个叫shut down,把它最终做关闭,所以现在这个分支合并框架,咱们通过这个小例子,就是从一加到100就完成这个代码的编写,这过程我们就完成了。完成之后最后呢,咱们把这个代码,我们最终做个测试,看一下最终的结果是怎么样的啊,当然他这结果各位同学应该都知道,最终肯定是5050嘛,就是一到一百五零五零,当然各位主要掌握里边这个拆分的过程。Fo式拆分作因式合并,包括最终测试,通过持微项我们进行最终这个结果,所以现在啊,咱们就把doc里边的分支合并框架最终给大家就说完了,大家掌握分支合并框架的特点,知道它是做什么的,以及咱们刚才写这个例子。
我来说两句