00:00
各位同学,我们继续,接下来我们给大家演示compatible future的通用功能和日常使用注意事项,并且向大家证明为什么它比future接口强大,如何减少了阻塞和轮询这两个痛点。来,同学们。前面理论知识的铺垫和介绍大家应该非常清晰,JAVA8引入了comfortable,那么后面引入的技术肯定要比前面的强大,那么它是future的异步函数接口的功能增强版,主要可以减少阻塞和轮巡,那么请问这个它是如何做到的?第二个可以传入回调对象,当异步任务完成或者发生异常的时候,可以自动调用回调对象的回调方法。那么我们一直说过,对于future。费时耗尽起一个异步任务,你去后台慢慢做,不要干涉主线程,主业务不停下来,那么到时候你需要做的时候,我们用get,但是1GET容易导致阻塞,对吧?我们最希望的我们说过一句话,是不是假设你这个义务一步任务when complete,当你完成的时候,可以自动的回调我或者是通知我,这样功能是不是相当OK呀,OK,那么来。
01:11
通过对comp,我们前面介绍过做一个相关的类比,这个相当于I,这个相当于I加加,那么他能做的这个一定能做,他不能做的这个也还能做,为什么?因为我实现了两大接口,后面的会比前面强好,那么下面我们代码说话,源码分析案例代入实战走,那么同学们我们呢,新建好这么一个类。来看一下,那么首先。我们呢,第二,那么前面说过这个呢,是没有返回值的,这个呢,Supply。供给型函数接口有返回值啊,那么我们现在先使用它。那么在这一块呢,我们到时候由于涉及到我们的线程池,二来进行相关的判断,那么在这儿我们他一先进来对吧,那现在呢,我们希望它有一个返回,比如说这个呢,我们就模拟一个呃任务,它能够给你返回一个number型的数字值,那么现在。
02:12
Random current next随机了啊,就是十以内的,那么。这个就是我们的运算结果,那么这个运算结果同学们,我们模拟啊,这个系统呢,花了一秒钟才能够。获得。那么接下来我们在这儿。一秒钟后。出结果,那么是个啥呢?就前面这个,那么注意supply,它是要有返回值的。Return。Result,弟兄们,OK,这个很简单吧,那么来。和之前一样,Comfortable future,来吧。在这块完成以后,我们和以前一样,那这个时候呢。
03:06
先去忙其他任务,那么都晓得这是个啥,这个是不是就是我们的may主线程?好,那么来吧,看future点第二打印出来,来,同学们是不是还是熟悉的配方,还是熟悉的味道,那么这个时候说难听点,Computer future所做的事情是不是跟我们的future接口原模原样?我们上半场先给大家证明。它完全能够取代future接口,它能做future接口,能做的完全能做好,同学们我们跑一下。现在大家请看,没有方法先去忙其他的工作任务了,我们在这儿和大家说,前面呢就已经给大家呢分享和说明过,不指定直接出现的是符合,就一秒钟以后出现的随机数是多少,是七,那么也就是说我们这段异步任务返回的结果值就是七,那么这个向大家证明了computer future完全可以替代future接口,OK,好,可是现在我们要说的是。
04:05
增强后面的I加加这个加加这些功能,它如何减少了阻塞和轮巡呢?最好你不要让我来get,容易产生阻塞,完成之后再告诉我呢,怎么做到的呢?来同学们继续给他进行相关的演示。那么现在。我们呢,干脆先把这个方法。抽取出来。好了,那么现在呢?这是我们之前computer future能够完成future的动作,那么对于我们现在新的内容,我们在日常工作中相关的使用。来,搁到这儿。怎么来,弟兄们?和之前差不多。那么这些呢,我呢,图个省事。直接拷贝粘贴我们的代码,同理还是用几秒钟,还是相关的返回。
05:00
对吧,那么接下来呢,那么各位亲搂一眼。如果换以前,我们没什么好说的,把它当做我们的future接口使用。但是现在。我们希望你上一步的计算。注意,这个就是我们的一个步骤,第一步买鱼。假设你买了一条鱼,随机数返回是个数字,随便是多少,比如说这条鱼是四斤重,OK,那么当你完成的时候。嗨。Complete,上一步完成以后BI consumer,那么BI代表要传递两个输入参数,Consumer是消费型函数接口,那么第一个就是上一步的12,第二个就是上一步运算结果会不会产生异常好。那么现在。要传入两个,一个叫V,一个叫E,这个V就是上一步的result,代表你上一步。完成了以后,第一阶段第一步完成可以,当你完成以后通知给下一步,那么下一步的话呢。
06:03
我们来用。When complete函数,那么现在这个方法一定要用,相当于说第一阶段完成了,当第一阶段上一步when complete完成了,我自动触发,那么现在这个V就是上一步的值,这个E就是指异常。如果E。是空,那么说明什么?没有异常,那么现在比如说计算完成。那么。更新。系统,那么假设啊,我们现在就是一个update。卖了。比如说把系统的某个值已经变成了上一步这个随机数生成的一个,这么说同学们OK来,那么这个是我们的什么,上一步一切顺利的前提下,那假设他不顺利呢?那么这个时候我们要带着我们的exception里。出异常了,这个是个什么function?需要一个输入,能够有一个返回function,大家请看它输入的是什么异常信息,所以说在这儿就是E。
07:04
代表,那么和以前的一样。来那么1.printok,那么来吧,那么现在我们就是什么异常情况咋整呢?那么这是不是1.get。加上我们的什么1.getmessage,然后此时我们返回的就是一个那OK,好,那么这一块我们和前面一样啊,但是这我们会发生一个小小的细节。那么合这儿。完全一样。那么在这块呢,以后呢,相当于说这个异步线程。他现在呢,要花一秒钟的时间去产生一个随机数,这是我们的业务逻辑,那么如果是正常情况下,它没有异常,它会打出这句话,就是你更新的返回值啊,这个result上一步完成以后将会传给下一步,那么这个就是第二步。那么。
08:00
上一步如果没有异常,走到这儿有异常了,走到这儿获得我们的结果,然后这个呢,是没线程先去完成,其他那么好,同学们,此时我们先来看一下我们会出现一个什么样的情况,运行了以后。来大家请看默认线程池进没进来,进来了说明我们这个异步任务完全触发了,那么他此时进来了,诶,但是好像没有出错嘛,产生一个随机做你的业务上应该不会出错呀,那为什么?异常是,那没有异常的时候,没有打印出这句话更新系统值呢。Update,手握好,那么接下来同学们请看,May呢,先去忙其他的,按照我们以前的了解,May先去忙其他的,它作为一个任务,另外一个任务是丢进现成池里面,Fo join这个里面对不对?同学们,那么对于我们的fo join这个池子里面,你应该该忙满你的呀,怎么突然就没有打印出这句话呢?难道我们的程序有误吗?情况不是这样的,那么下面请看一下笔记。
09:01
要解释一下为什么默认线程池会关闭,自定义线程池我们要自己记得关闭好,这句话什么意思呢?来同学们,由于啊,还记不记得我们前面讲过一个守护线程和用户线程。你这儿。需要一秒钟去处理你的业务,但是main方法太快了,由于在这个程序里面,C线程池呢,就像是一个守护线程一样,如果may已经结束了,它就把它给关掉了,导致这个里面用不到,所以说我们一般而言会在这儿,要么主线程不要让它立刻结束。延时三秒钟对吧?当然你可以有更多的数字,好,那么暂停三秒钟的线程,那么这个注释呢?我们节约时间,我就不在手敲了,课件上都有那么好,同学们看一下,我们现在完成我们可没有用什么get啊,大家请看,还是用默认的符合就音铺没线程先去完其他任务了,一秒钟以后出的结果是几啊?我们这个随机数是不是二啊?那么计算完成更新系统update value2,那么相当于说这个异步任务耗时费劲,假设要花一秒钟或者两秒钟先去忙吧,你忙完以后win complete,你直接给我调用另外一套微服务,或者执行一个搜求语句,把我们的某个值或者某张表,或者某些其他业务触发和修改,那么这样是不是你瞒你的?
10:22
我瞒我的,咱们各不相干啊,OK,好,那么所以说在这块就要明白是不是有点发现comp它的强大,能搞定future,也能搞定自己的扩展功能啊来,那么对于这个。我们呢,再做一下优化,你可你可能会觉得好,你这儿我也明白了,符合Joy义呢,是有有点类似于是一个守护线程,如果麦已经完成了,它就突然没了,这你故意给它卡着,那么能不能不用呢?可以,那么同学们别忘了我们前面说过这个东东说白了底子是不是就是我们的computer future这样的一个类,就按我们的线程池来配合呀,所以说呢,我们呢,日常工作中尽量使用我们自己的线程池啊,那么我们在现在的教学。
11:08
写的这些案例当中呢,老师图省事,就没有写自定义的线程值好。那么现在同学们。
我来说两句