00:00
各位同学大家好,我们继续通过上一讲,我们对future接口的相关架构做了一下说明,也明白了它能够同时满足这三个特点,那么对应的task任务类通过这些API的入门级别的调用也清楚了如何获得一个。带有返回值的异步多线程任务,结合我们的threat类,并且获得它的处理结果,好,那么通过上一讲我们清楚了它入门级别的API调用,那么自然而然我们下面需要更进一步的通过案例和代码来给大家分析的优缺点,那么请大家放心,这门课绝对不会给大家。讲解简单API的调用,我们下面要通过对的编码实战和分析给大家说清楚为什么要从future慢慢的演化到了comp future,你既然这么好,为什么后面会出了这么一个新东西,它中间的底层的设计思想和它的。演化过程是什么样的,需要给大家分析清楚,好,那么下面我们来看看future的优点,那么自然而然肯定会有优点吗?那么对应的缺点是什么呢?我们呢?两害相衡取其轻,优缺点互相结合,以后给大家分析出为什么有它好,我们接下来来看一眼。
01:12
Future,那么结合我们的线程池二注意异步多线程任务的配合能够显著提高程序的执行效率,那它有没有优点要对于我们程序没帮助,那么自然而然不会有人用,那么下面呢,我们呢,直接代码说话好,那么同学们,那么现在future。结合我们的线程池。来,那么同学们继续。下面呢,请同学们考虑这样一个需求,那么就是三个任务。目前只有一个线程。卖。来处理。那么请问。耗时多少?OK,那么假设啊,我们现在有三个任务啊,那么现在呢,有且仅有一个妹,那么不用多说。
02:04
工作有三个人,只有一个,那么他是只能挨个挨个干,那么现在啊。我们来看看他的耗时统计,那么很简单,开始时间,结束时间,那么做完以后的结束时间一减,就可以获得它的耗时秒数。那么。这个呢?是我们最简单最经典的。那么假设这是end。对吧。好,同学们,我们呢,很简单。那么现在。假如说有且仅有一个啊,这个呢,任务一是500秒,任务二是300秒,任务三是300毫秒,当然我们这个都是毫秒了,那么现在。肉眼可见,一加都会清楚三个任务,假设第一个任务要耗时,这个这个这个,那么挨个累积了以后,我们都会清楚,大概是1100毫秒之上,那么内线成完活,那么这儿我们可以清楚。
03:02
最简单的方法是不是要开启我们的多线程啊,然后来帮着这个麦来处理相关的任务和工作。那么好,我们现在。我们拿走。现在M1就是我们刚才的案例。和之前一样,还是熟悉的配方,但是是不同的味道,目前啊。那么现在呢?我们呢?开启多个异步任务线程。来处理,那么请问有耗时多少呢?一句话就跟刚才一样,你现在呢,只能是挨个挨个一件事一件事的做,那么现在我给你反过来,我们可以齐头并进,三个人同时做不同的三件工作,来看看他的总耗时来吧。那么同学们,我们六。Future task,那么假设啊,我们这儿呢,随便返回,那么future task1这个就是一号任务,那么都晓得。他呢?
04:01
直接来实现我们的接口,那么同学们和刚才一样毫秒级别啊,假设线程一,它要处理这个工作要耗时500毫秒,那么return,那么就是TASK1。Over这波没问题吧,那么相当于它呢,就是一个异步的task future task任务。那么如果说我们要。给它处理,按照我们之前所学的东东,那么现在是不是future task1,那么给我们的T1线程,然后直接T对吧?T star搞定没问题,那么现在就是T线程去处理这个future task任务,好的。那下面的问题是,我们再想想如何进一步提升我们的程序的性能呢?别忘了,我们现在是每new一个任务,就每次就new一个THREAD11对应,好说现在几个,三个,如果有一天变成十个呢?那么这个时候我们是不是每一个新任务都要拗一个,每一个新任务都要六一个,我们程序压力会慢慢的变得臃肿,那么这个时候我们再想一下,我们是不是尽量的需要能够做到一种什么线程复用,这是第一个,第二个尽量不要拗,因为你一个对象就要进行GC垃圾回收,如果我们可以把以前的线程复用,这个是不是大大提升我们的。
05:21
程序性能啊,那么这样大家可以想一下,我们用什么样的技术,不用每次都要去拗一个线程,但是还能够获得线程来使用呢?那么自然而然结合之前。对,大家guc基础知识要求,我们讲过一个知识点,是不是说过一个东东叫线程池啊,OK,我提前给你弄好,那么现在,那么大家请看。这个时候我们呢,Fix pro固定线程数的,OK,那么这个呢,就是我们的线程池,相当于这个池子里面已经直接给你六好了,几个三个你可以直接拿过来用,不用你再写这样的代码了,OK,好的,那么现在呢,我们来改一下我们的程序。
06:01
对于我们的线程池啊,我们的submit实现了回接口的一个实现内就行了,那么自然而然我们的future task1首当其冲丢进去,那么它呢,就完成了我们的一号任务。那么。如法炮制。直接复制过来,那么下面我们这个就是任务二,那么现在任务二也完成,假设它呢是300 OK,那么现在呢,这个呢。我们也是把我们的future task2号任务也提交给这个线程池,那么最后200,那么还剩下最后一个对吧?那么相当于说这个呢,就是我们的妹线程,那说白了就是小伙伴一号二号各自认领一个任务,我们的妹线程再去认领剩下第三个任务,那么现在就是三个小伙伴来处理,那么看看它耗时多少,那么我们呢,使用线程时的时候记得。资源类的动作一定要释放和关闭好了,那么在这块完了以后,和之前一样啊,我们也要来统计一下这哥们耗时多少。
07:03
来,那么到最后多少毫秒这个呢,我呢也就不再写了,那么在这也就是我们的最终内线程也完成,对吧,它是呢,做着最后的一个好了,那么同学们请看一下,我们大家都清楚。现在呢?我可没有写这个,Get一句话,我只让你去。处理运算并没有找你要返回值,OK,好,我们先看看我没有写get的时候,看看它的总耗时是多少。那么同学们,我们搂一眼。现在后台你看多少啊。接近400毫秒,而上一个是多少,是1100毫秒以上,那么现在是非常的性能是非常非常的好,有显著的提高,那么接下来我们来看看,那你不是没有。获得吗?那么来吧。Future task1,我们都晓得get,那么对于get而言,我们需要抛出一,我们这呢,直接呢,偷个懒,直接抛出来好,那么这是我们的future task1,这是我们的future task2,好了,那么同学们可以现在两个。
08:08
有运算也要让你呢,给我返回计算结果,那么自然而然会比这个呢,耗时多一点点,但是会不会好过我们之前的一个内线程1100毫秒呢?那么大家看一下我们的性能和效果如何?大家看一下多少800多,哎,几乎呢,是什么可以节约1/3的性能,所以说我们可以看得出,对于future这样结合线程池异步多线程的任务配合,是能够显著提高程序的执行效率的,哎,这也就是我们什么慢慢的要考虑多线程高并发一个一个的底层设计思想和它的代码优势。
我来说两句