为什么要用Future
我们在并发编程时,常常会利用两种创建线程的方法:
继续Thread类实现Runnable接口但是这两种方法都短缺我们常常会碰着的一种需求----获取线程实行结果。
比如我们要进行两个运算,然后把两个运算的和返回。当然我们可以利用串联实行两个运算,然后再将两个结果求和返回。但是如果我们但运算特殊繁芜,耗时较多,我们须要统筹韶光,让两个运算一起实行,处理器多个核心分别处理一个运算,这样会极大降落处理韶光。利用Thread和Runnable都无法获取实行结果,这时候我们就须要用到Future了。

JDK1.5开始,就供应了Callable和Future。Future模式的核心思想能够让主线程将原来须要同步等待的这段韶光用来做其他的事情。让主线程不必等待任务完成,而是过段韶光来获取实行结果。
Future接口CompetableFuture和ForkJoinFuture两个类实现了Future接口,RunnableFuture和SchedualedFuture两个接口继续了Future接口
RunnableFuture这个接口同时继续Future接口和Runnable接口,在成功实行run()方法后,可以通过Future访问实行结果。这个接口都实现类是FutureTask,一个可取消的异步打算,这个类供应了Future的基本实现。FutureTask能用来包装一个Callable或Runnable工具,由于它实现了Runnable接口,而且它能被通报到Executor进行实行。为了供应单例类,这个类在创建自定义的事情类时供应了protected布局函数。SchedualedFuture这个接口表示一个延时的行为可以被取消。常日一个安排好的future是定时任务SchedualedExecutorService的结果CompleteFuture一个Future类是显示的完成,而且能被用作一个完制品级,通过它的完成触发支持的依赖函数和行为。当两个或多个线程要实行完成或取消操作时,只有一个能够成功。ForkJoinTask基于任务的抽象类,可以通过ForkJoinPool来实行。一个ForkJoinTask是类似于线程实体,但是相对付线程实体是轻量级的。大量的任务和子任务会被ForkJoinPool池中的真实线程挂起来,以某些利用限定为代价。Future紧张方法get()当任务结束后返回一个结果,如果调用时,事情还没有结束,则会壅塞线程,直到任务实行完毕。get(long timeout,TimeUnit unit)可以许可在一定韶光内去等待获取实行结果,如果超过这个韶光,抛出TimeoutException。cancel(boolean mayInterruptIfRunning)我们可以取消这个实行逻辑,如果这个逻辑已经正在实行,供应可选的参数来掌握是否取消已经正在实行的逻辑。调用cancel并不是一定可以停滞实行。isDone()我们可以判断实行逻辑是否已经实行完成。isCancel()我们可以判断实行逻辑是否已经被取消。