00:00
各位同学大家好,我们继续完成了前面理论知识的介绍,那么接下来第二步代码实操更进一步,通过案例来给大家介绍如何使用,如何获得好。那么下面请看核心的四个静态方法来创建一个异步任务。那么这个时候我们就会产生一个疑问,为什么要用静态方法?我们现在要想获得一个卡future,这不很简单的事吗?大家请看啊,这个呢是我们的程序入口。那么现在这个类。实现了两个接口,那只要是内大家都清楚,这还有什么好说的。No,他们。OK,那么来吧,这个类。直接用药最经典的方法,获得中规中矩,然后大家请看里面是不是就是我们这个类实现了两大接口,各种方法直接调用不就OK了吗?那么为什么?我们这儿要。多此一举的说,核心的几个四个静态方法呢?那么这四个静态方法又是哪四个呢?那么为什么不推荐使用六这样的方法来获得呢?那么来同学们先来看一下。
01:11
我们的API的说明,首先在我们的Java concurrent这个包下面,能够按照我们的类找到我们的compat future这个类,来看一下它的构造方法。几个有且仅有一个,哎,它这儿是这么跟你说的,创建了一个新的incomplete complete future incomplete什么意思啊,没完成的。不完美的,不完备的,所以说它只是从语法上希望你呢能够合规,但是实际工作中,按照官方建议,不推荐你使用我们的new空餐构造方法来获得一个comp future,这是第一步要注意。那如何获得呢?因为我们前面也说过了,Computer功能更强大,可以分阶段提交多个异步任务给他们组合使用,那么我们如何获得这么一个对象呢?
02:04
那么现在我们呢,就来看一眼,分两组。四个方法来获得,那么这两组分别叫run和supply,那么第一组它呢,无返回值,第二组有返回值,分别他们的APC的构造如脑图所示,大家请看。现在我们先说理论,对于这个run,它传进去的是什么?Runable接口,那么第一个构造方法,第二个构造方法,传两个参数,一个是实现了runable接口的一个类,作为一个线程,第二个ex啥意思啊,线程池那么好,注意只要是传reable,我们大家都清楚有没有反回值啊,没有,所以说它是。空的,那么所以说它的反馈值泛型里面写的是VO啊,待会儿我们会说一下这个。第二组呢,也有两个叫supply,实际工作中我们常用的是这个,因为它有返回值,便于我们程序的调试和系统的交互,那么和前面一样。
03:05
只不过在这两个方法名字不同,它呢传一个able接口,这个呢传个supply,我们前面说过,对大家呢,JAVA8方法引用函数式编程有过一定的前提知识的要求,这是一个供给型。参数接口OK,那么这个时候也一样传递我们的线程池,好,那么所以说我们把理论先说干净,如果没有指定我们这个线程池啊,直接使用默认的folk join。作为它的线程池执行什么?你所生产的异步代码,如果你有一个线程池,明确指明了,就用你自己指定的线程池,OK,一句话,主人,如果你用的是这两个方法,没有给我指定线程池,我用join,我默认自带的,如果给我指定了,那么你让我用哪一个,我就用哪一个。那么从这儿我们大家可以看得出它是一脉相承的,什么意思啊,前面大家还记不记得?
04:01
我们讲过讲过future编码实战这一小节的时候,是不是说过future接口和线程池的异步多线程任务配合,可以显著的提高程序的执行效率,哎,所以说说到底原理,也就是我们的什么异步线程,那么看要不要有返回,再结合我们的线程池来提升我们的程序效率,OK,底子都是这些基本功好,那么理论知识完成以后,下面我们就要编码说话,结合前面的有无返回时啊,给大家进行进一步的讲解来。那么。讲完了,语法上new可以,但是不推荐,尽量使用我们提供的四大核心的检查方法,来一组computer future点,大家请看RUN1步,那么这个是runable,有无线程值参数传递。我们先说第一个最简单的,好同学们。那么大家请看这个呢。是我们的comp future,那么在这个里面要传一个我们的什么runable接口,对吧?那么大家都清楚runable接口自然而然可以有拉的表达式,那么来吧,同学们。
05:10
我们先来看一下有没有进来,然后。我们的程序呢?假设啊,我们模拟业务上系统呢,执行一秒钟,好,此时大家请看我丢进去的这个是一个什么runable接口的实现内那表达式。我们的业务逻辑就这么一句话,那么现在我这可没有return,因为reable是不需要返回,这是第一个,第二个来看一下VO啥dont。它是个什么?Final class,这也是一个类,诶,这也是什么?我们的一个算是一个非常少见的一个类,但是在这儿可以明确的告诉大家,没有返回那么好,我们前面强调过computer future,它可是实现了future加competition stage两大接口,所以说future能干的他也能干,那么现在同学们看future第2GET。
06:00
我非要输入,那么我现在想看一下这个get,你不是没有返回吗?这又是word,那么它输出的会是个什么?好,那么同学们。跑一下看看我们程序运行以后,和我们前面讲的理论知识啊,可不可以一一对照来,同学们可以看得出。如果我在第二个参数这用的方法只传入一个参数,那么默认的就是完成我这个异步任务,处理的是fo join,这个它默认自带的线程池还是我们前面所说的future加线程池,OK,那么自然而然没有返回值,这个get是个啥?就是个那OK,那么各位亲,这个。就是我们的第一个案例。我们用future。我们用computer执行的是run e不犯法,好,那么接下来呢,我们呢,不妨来看我们的第二组。此时呢,我呢,直接。拗了一个线程池对吧?通过我们的构造方法这样一个工具类,那么由线程池养成好习惯,最后使用完了可以将其关闭,那么来这个方法我们用第二个。
07:10
来,此时我们是可以传一个我们自己指定的线程池,此时同学们请看,没有运行之前你没有指定线程池,用的是默认符合join to,如果你现在自己指定了线程池,那么大家请看一下这个线程池的名字100%产生了变化和修改,OK,那么就是我们自己的这个线程池啊。所以说在这儿回到我们的理论知识。就是这个意思,没有指定用默认指定了,你指定哪一个我用哪一个好,这就是我们的第一组没有反馈值的,那么就给大家呢,先介绍到这儿,那接下来。那么各位同学,我们接下来呢,就来试试,那假设有返回值的呢,我们现在呢,这个没有返回值,可能只是变更了另外一套微服务系统的状态,修改了一条数据库的值,那么现在我们实际工作中,我们当然希望你做没做完,做了个什么情况,给我们一个反馈,所以说要学习它的第二组有返回值的。
08:06
对应的调用方法,那么来这个时候就是我们的什么supply c,那么来各位同学请看,那么这个时候supply它是一个什么?供给型函数型接口有两个,第一个只传这个,第二个是否是要传递我们的线程池,和前面这个是一路货色好,只不过区别就是有没有我们的。返回值好,那么同学们,那么搁到这儿了,以后我们呢,也是come future,那么假设啊,现在呢,我让它返回一个string,最经典的,那么来搁到这。同学们可以看一下,我们呢,和前面的一样。业务逻辑照抄。那么对于回到我们这个。方法的源码里面supply来,人家要的是什么,获得一个结果,注意supply供给型函数式接口,没有输入参数,但是确实有一个反馈值,哎,符合我们的规范和调用,那么搁到这儿。
09:05
我们这儿呢,就需要给它一个返回值了,那么。哈喽,我们呢,把这个调用方法将其打印出来也是一秒钟好了,那么和刚才一样,一秒钟以后它能够有什么样的效果和作用呢?刚才我们的get大家呢,可以看出是个啥,那那么此时我们呢,直接调用。来,大家请看,没有指定线程池,还是join,和之前的不一样,此时的get就不再是那,而可以清楚的得到我们这个异步任务,它处理完成以后的返回结果,好,那么自然而然也和前面一样。那么来我们呢,直接指定了我们的线程池再跑一次,我们可以看一下效果,那么我们可以清晰的看到有返回值,且线程池用了我们自己指定的,OK,好,那么这个就是我们要通过。尽量不要通过new来构建computer,尽量使用我们的这个run和我们的supply作为异步线程来获得我们的。
10:07
结果和返回值好,那么这个就是我们API入门级别的讲解。
我来说两句