【Future使用场景】

Future表示一个可能未完成的一部任务的结果,针对这个结果可以添加CallBack,以便在任务执行成功或失败后作出相应的操作。

Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效旳减小系统的响应时间和提高系统的吞吐量。

【Future的类图结构】

【各个模块解释】

Future接口:类似前文中描述的订单或者是契约,通过它,可以得到真实的数据。

RunnableFuture接口:继承(接口与接口之间也是继承)了Future和Runnable接口,其中run()方法用于构造真实的数据。

FutureTask类:实现了RunnableFuture接口的类,它有一个内部类:Sync。

Sync内部类:FutureTask的一些实质的工作,会委托给Sync类去实现。

Callable接口:Sync最终会去调用Callable接口,完成实际的数据组装工作。

【关于Callable接口的注意点】

Callable接口只有一个方法call(),它会返回需要构造的实际数据。

Callable接口是Future框架和应用程序之间的重要接口,如果我们要实现自己的业务系统,通常需要实现自己的Callable对象,此外,FutureTask类也与应用密切相关,通常会使用Callable实例构造一个FutureTask实例,并将它提交给线程池。

【Future的主要方法】

public interface Future<V> {

    /**
* Attempts to cancel execution of this task.
*/
boolean cancel(boolean mayInterruptIfRunning); /**
* Returns {@code true} if this task was cancelled before it completed
*/
boolean isCancelled(); /**
* Returns {@code true} if this task completed.
*/
boolean isDone(); /**
* Waits if necessary for the computation to complete, and then
* retrieves its result.
* @return the computed result
* while waiting
*/
V get() throws InterruptedException, ExecutionException; /**
* Waits if necessary for at most the given time for the computation
* to complete, and then retrieves its result, if available.
* while waiting
* @throws TimeoutException if the wait timed out
*/
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}

【Future接口方法理解】

[ V get()方法 ]

当任务结束后返回一个结果,如果调用时,工作还没有结束,则会阻塞线程,直到任务执行完毕。

[ V get(long timeout, TimeUnit unit) 方法]

多等待Timeout的时间后,就会返回结果

[ boolean cancel(boolean mayInterruptlfRunning)  方法]

来停止一个任务,如果任务可以停止(通过设置mayInterruptIfrunning来判断),则可以返回true,如果任务已经完成或者已经停止,则这个任务无法停止,直接返回false。

[ boolean isDown()方法 ]

判断当前方法是否已经完成。

[ boolean isCancel()方法 ]

判断当前方法是否已经取消。

【JDK中的Future模式 实例】

/**
* Created by HigginCui
*/
class RealData implements Callable<String> { private String data; public RealData(String data) {
this.data = data;
} /**
* call()方法
* 1.可能是一个很耗时的方法
* 2.会构造我们需要的真实数据并返回
*/
@Override
public String call() throws Exception {
Thread.sleep(); //这里执行的任务非常耗时
return "Hello World to "+ data;
}
} public class FutureMain { public static void main(String[] args) throws Exception {
//构造FutureTask
FutureTask<String> futureTask = new FutureTask<String>(new RealData("HigginCui")); ExecutorService executorService = Executors.newFixedThreadPool(); //执行FutureTask
//这里开启线程执行RealData的call()执行
executorService.submit(futureTask);
System.out.println("请求完毕了---"+System.currentTimeMillis()); //这里main线程可以继续做自己的事情
Thread.sleep();
System.out.println("浪2秒钟后---"+System.currentTimeMillis() ); System.out.println( "最后我们拿需要的真实数据:" + futureTask.get()+ " ---"+System.currentTimeMillis() ); }
}

【运行结果 可以看到三条记录之间的时间差分别是2s,3s】

【关于线程池的注意点】

线程池的两个执行任务的方法:一个是execute()方法,一个是submit()方法。

两个的区别:submit()执行的任务可以是实现Runnable接口或者Callable接口,

而execute只能执行实现Runnable接口的任务。

submit有返回值Future,而execute方法没有返回值。 返回值的Future值得注意的是有一个方法是get(),如果返回是null,证明任务执行完毕。

最新文章

  1. 每天一个linux命令(49):at命令
  2. java学习流程
  3. 动态分配的顺序线性表的十五种操作—C语言实现
  4. spring security 控制用户信息用户加密 缓存用户信息
  5. iOS 复杂tableView的 cell一般设计思路
  6. andorid 文字颜色selector的使用
  7. 使用PHP抓取网站ico图标
  8. (转载)将DELPHI数据库连接写进INI配置文件中
  9. 常见的jquery一些效果
  10. Lambda表达式随笔
  11. C#方法有关内容的总结--C#基础
  12. Linux 命令locate
  13. threejs绘制顺序
  14. widget jquery 理解
  15. Beta阶段冲刺-3
  16. 使用Spring框架入门三:基于XML配置的AOP的使用
  17. java读取网页图片路径并下载到本地
  18. SVN 基本的工作循环
  19. 非定制UIImagePickerController的使用
  20. c语言中变量/函数命名以单下划线(_)和双下划线(__) 开头的意义

热门文章

  1. 02. css3有哪些新特性?
  2. 项目构建工具maven的使用方法
  3. 求一个n元一次方程的解,Gauss消元
  4. confiparser模块
  5. Shiro源码解析-登录篇
  6. ActivityManager的代理模式
  7. gps数据上传防止android系统休眠
  8. 2016424王启元 Exp2 后门原理与实践
  9. 【温故知新】C#基于事件的异步模式(EAP)
  10. selenium+Python(定位 单选、复选框,多层定位)