00:00
同学们,我们继续通过上一讲,我们已经明白了future接口结合线程池异步多线程任务的组合,能够显著的提高我们的程序效率,如果你只有一个线程去做三个任务,每个任务耗时的话,大概按照我们的设想,那几乎要耗费1100多毫秒,但是结合我们的多个线程去做,对吧?那么人多力量大,只需要耗费800多毫秒,那么耗损。和我们的成本只是原来的2/3,那么接下来我们的优点介绍完了,我们也得说说future它的缺点,那么正是因为有这些缺点以后,所以我们不得不推出了我们的compatible future,哎,这个演化过程和它底层的设计原理和代码思想要给大家进一步阐述。那么来。它的缺点主要有显著的两个,那么先说第一个get方法,我们大家调用过多次的,也演示过多次的,它容易导致阻塞,好,那么同学们代码说话。现在大家请看我们又一个一步任务future task,那么假设它是string啊,那么在这future task好了,那么来吧,那么同学们搁到这儿了,以后我们大家可以看一下啊,那么。
01:10
进没进来呢?Come in。以前我们就很快的返回了啊,假设这呢,就是task over任务完成好说。可这都是顺利的情况,假设这个任务呢,比较耗时。现在呢,不可能秒回,可能需要呢,你等待呢,五秒钟,五秒钟以后我才能够把这个工作完成,对吧,我做一个异步任务,我们前面强调过,所谓异步任务就是那些费时费力耗尽的,不想耽搁内线程,那么直接下来以后甩出去。另起一个异步线程,你给我单独去处理,完了以后我们再用get方法来获得你的处理结果和效果,好,那么现在呢,我们来吧。New thread,那么future task,那么在这呢,我们就提一下。
02:02
t1.start,那么我相信各位亲,这个代码应该是非常的熟悉了,对吧?那么相当于说在这儿future task开工,T1线程任领任务,你就去忙,这些费时耗尽的大概要耗费你五秒钟啊,那么现在呢,我们接下来。那么我们的脉线程。完其他任务了,那么不耽搁对吧,那么最终那么弟兄们我们来看一下。那么五秒钟以后,你在这儿开高。没线程在这儿开高,各忙各的,那五秒钟以后,你这个future task。是不是应该给我把相关的东东给我返回啊,那么注意第二套,那么要抛出异常,好,那么大家看一下我们的任务执行起来会有什么样的情况呢?走起这个呢,大家看麦先去玩其他的了,T1这个线程进来了,五秒钟以后,大家请看task over灯灭了,那么这个时候我们皆大欢喜,获得了我们义务多线程所执行的任务。那么这个程序我相信写到这儿同学们一目了然,清清楚楚,很和谐,很自然,像大自然一样自然,没什么问题吧。
03:14
好,接下来我们就要看了。此时。我这个计算过程几秒钟要五秒钟,好我们这个get是放在最后的,对吧?那么我们来看看它的弊端缺点,最严重的一个问题,容易导致阻塞,好同学们请看,现在呢,我把内线程和我们的get。要一个头。有点类似于我这要花费多长时间,五秒钟,那么程序执行完了以后,跑到这儿这么快。线程是纳秒级别的对吧,相当快,那这个时候说明什么,我get根本就没有算完呢,我没有算完的时候你就来调用我。也就或者说没有把我放在最后。那么现在我们会出现什么情况呢啊?
04:03
我点开。T coming t1确实正在忙了,但是大家可以看得出,这个要准备去忙其他任务的main线程是不是被阻塞被格挡了,啥意思啊?Get的方法,它的意思就是说只要你调用我了。我马上就去找这个future task,拿我的处理结果,如果刚好你已经算完了,直接给我,咱们皆大欢喜,但是如果你没有算完,你也去调用我这个get方法。极度出现程序阻塞的情况,也即只要调用get了,我会傻了吧唧的傻傻的非得等着这个future task。你算完了以后,我拿到结果了,我才走,一句话,它这个有点死心眼儿,直接就是什么,一旦调用get马上就是什么。不见不散,非要等到结果。才会离开。不管你是否。
05:02
计算完成。那么。容易。程序怎么着?产生我们的什么?堵塞。哎,这个是非常非常要命的,所以说一般而言,我们把get都会放在我们的什么最后面,哎,不要影响其他程序,他们先去做这些容易的,你这个最费劲的放到最后,那么这样是不是互不干涉,好这是第一个问题,那么第二个问题啊,那么同学们。或者我们呢,直接把我们的小结论呢,就写到这吧,那么首先啊,Get容易导致。主色。一般建议啊。放在。程序后面那么来它呢,只要一旦一旦调用。不见不散,非要等到结果才会离开,不管你是否计算完成,容易成虚堵塞。那么第二个我们再来看一下。
06:03
假如。那么我不愿意。等待很长时间。我希望干嘛?过时不候。过时不候。可以自动离开。这是什么意思呢?好。如你所说,那么杨哥。我们呢,也把我们的get最费劲最耗时的放在最后,对吧,不影响其他线程,好比我们考试都会说难的东西留在最后,容易的题目你先做,OK分开,那下面的问题是你这要处理五秒钟啊,我问题是我放到最后了,但是我现在希望什么过时不候,就是有一定的自主度,我的等待时间,比如说我只愿意等待两秒。能理解这个意思吗?好,那么同学们请看我不设置之前。走。几秒,我必须要眼巴巴的妹去忙其他任务了,你这个T1现场,我待会儿来取的时候不好意思啊,你非要等足我五秒才能给你这个结果。那么现在。
07:10
我们呢?看一眼。结合它,我们get给我们提供了第二种方法,那么就是什么过时不候?我们规定你处理业务逻辑需要多少秒,我不关心,那是你的事儿,但是不好意思啊,我只愿意等你三秒。当然这个时间的单位你可以任意设置,那么get。他还会抛出一个timeout超时的异常好。一句话。那么。我们一跑起来就能看到我们的效果,你要处理几秒,五秒妹去忙其他的了,三秒钟到了以后,我拿不到结果,马上就抛出异常,那么这个时候相当于强行的非常粗暴的阻断了这个程序,那么另外的程序一定要用,只要收到这个异常了,OK,那么可能type out except收到补货,到这个异常以后会做其他的。
08:02
止损的处理,那么这样是不是可以从一定程度上避免我们的程序阻塞呀,OK,所以说。
我来说两句