【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,证明任务执行完毕。

29_Future模式2_JDK内置实现的更多相关文章

  1. JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象

    Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...

  2. JavaScript (五) js的基本语法 - - - 面向对象、工程模式、内置对象、JSON

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.编程思想 1.定义: 编程思想:把一些生活中做事的经验融入到程序中 面向过程:凡事都要亲力亲为,每件 ...

  3. PHP内置Web Server探究(二)自定义PHP控制台输出console函数

    我们在开发APP的服务器端,当和APP进行联调时通常需要实时跟踪URL请求和参数的接收情况. 但PHP并没有像Python或Java专有的控制台输出函数,Python的print()和Java的Sys ...

  4. 迭代器模式的一种应用场景以及C#对于迭代器的内置支持

    迭代器模式 先放上gof中对于迭代器模式的介绍镇楼 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 别名 游标(Cursor). 动机 一个聚合对象, 如列表(li ...

  5. JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门

    2 JSP内置标签(美化+业务逻辑)   1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容   2)JSP内 ...

  6. BAT-把当前用户以管理员权限运行(用户帐户控制:用于内置管理员帐户的管理员批准模式)

    相关资料: http://jingyan.baidu.com/article/72ee561a5dc24fe16138df95.html 网友求助:联想Y400,Win8系统 怎样获得管理员身份 要求 ...

  7. Future模式的学习以及JDK内置Future模式的源码分析

    并发程序设计之Future模式 一).使用Future模式的原因 当某一段程序提交了一个请求,期待得到一个答复,但服务程序对这个请求的处理可能很慢,在单线程的环境中,调用函数是同步的,必须等到服务程序 ...

  8. JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

    目录 JSP的执行原理.JSP的内置对象.四大作用域解析.MVC模式理解 JSP的执行原理 这里拿一个小例子来解析JSP是如何被访问到的 首先将该项目部署到tomcat,并且通过tomcat启动 通过 ...

  9. 一行代码,让 VS Code 内置 PDF 阅读器变成深色模式

    使用 CSS/JS 简单实现 PDF 深色模式.

随机推荐

  1. 【转】JavaWeb之Session的序列化和反序列化 && Session的活化和钝化

    应用场景: 1.一般来说,服务器启动后,就不会再关闭了,但是如果逼不得已需要重启,而用户会话还在进行相应的操作,这时就需要使用序列化将session信息保存起来放在硬盘,服务器重启后,又重新加载.这样 ...

  2. json操作相关记录

    json是javascript衍生的数据表示法,现在许多数据的处理都使用json. 平时用到的与json结构相似的有很多,如mongodb数据库,python的字典等.核心思想就是键值对. json的 ...

  3. 第十次 Scrum Meeting

    第十次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/4/16 14:30 30min 新主楼F座2F 附Github仓库:WEDO 例会照片 工作情况总结 人员 上阶 ...

  4. java多线程-线程间协作

    大纲: wait.notify.notifyAll Condition 生产消费者 一.wait.notify.notifyAll wait.notify.notifyAll是Object的本地fin ...

  5. 自学springboot

    参考资料 https://www.renren.io/guide/

  6. Jquery ajax, Axios, Fetch区别

    1.   Jquery ajax, Axios, Fetch区别之我见 2.   ajax.axios.fetch之间的详细区别以及优缺点

  7. Java .Net Byte数组存储差异以及解决方法

    最近在Java与.Net服务Bytes数据交互碰到一个问题:.Net IntToBytes结果和Java IntToBytes结果是反序的,查了一下发现:Java stores things inte ...

  8. BAE+Python+Django+Wechatpy+Baidu weather api +微信订阅号 = 实现微信查询天气

    最近想在微信上面实现天气查询,分两个步骤: 1.被动回复:输入天气.xx天气获取天气情况 2.主动推送:每天定时推送天气(针对24小时内产生交互的人) 目前已经实现第一个步骤,如下: 现将实现此功能环 ...

  9. MySql的视图

    视图是从一个或多个表中导出的表.是一种虚拟存在的表.视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据.这样,用户可以不用看到整个数据库表中数据,而只关心对自己有用的数据.视图可以使用户的操作更 ...

  10. log4j的PatternLayout参数含义

    参数 说明 例子 %c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介 假设当前logger名字空间 ...