这里有新鲜出炉的 Java 设计模式,程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称.
这篇文章主要介绍了 Java 和 Scala 中的 Future 的相关资料, 需要的朋友可以参考下
随着 CPU 的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于 Scala 是一门函数式语言,天然的支持异步编程模型,今天主要来看一下 Java 和 Scala 中的 Futrue,带你走入异步编程的大门.
Future
很多同学可能会有疑问,Futrue 跟异步编程有什么关系?从 Future 的表面意思是未来,一个 Future 对象可以看出一个将来得到的结果,这就和异步执行的概念很像,你只管自己去执行,只要将最终的结果传达给我就行,线程不必一直暂停等待结果,可以在具体异步任务执行的时候去执行其他操作,举个例子:
async work
我们现在在执行做饭这么一个任务,它需要煮饭,烧菜,摆置餐具等操作,如果我们通过异步这种概念去执行这个任务,比如煮饭可能需要比较久的时间,但煮饭这个过程又不需要我们管理,我们可以利用这段时间去烧菜,烧菜过程中也可能有空闲时间,我们可以去摆置餐具,当电饭锅通知我们饭烧好了,菜也烧好了,最后我们就可以开始吃饭了,所以说,上面的 "煮饭 -> 饭 "," 烧菜 -> 菜 " 都可以看成一个 Future 的过程.
Java 中的 Future
在 Java 的早期版本中,我们不能得到线程的执行结果,不管是继承 Thread 类还是实现 Runnable 接口,都无法获取线程的执行结果,所以我们只能在线程执行的 run 方法里去做相应的一些业务逻辑操作,但随着 Java5 的发布,它为了我们带来了 Callable 和 Future 接口,我们可以利用这两个接口的特性来获取线程的执行结果.
Callable 接口
通俗的讲,Callable 接口也是一个线程执行类接口,那么它跟 Runnable 接口有什么区别呢?我们先来看看它们两个的定义:
1.Callable 接口:
2.Runnable 接口:
@FunctionalInterface public interface Callable < V > {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
从上面的定义,我们可以看出,两者最大的区别就是对应的执行方法是否有返回值.Callable 接口中 call 方法具有返回值,这便是为什么我们可以通过 Callable 接口来得到一个线程执行的返回值或者是异常信息.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Future 接口
上面说到既然 Callable 接口能返回线程执行的结果,那么为什么还需要 Future 接口呢?因为 Callable 接口执行的结果只是一个将来的结果值,我们若是需要得到具体的结果就必须利用 Future 接口,另外 Callable 接口需要委托 ExecutorService 的 submit 提交任务去执行,我们来看看它是如何定义的:
总结
<T> Future<T> submit(Callable<T> task);
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
以上所述是小编给大家介绍的 Java 和 Scala 中的 Future,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对 PHPERZ 网站的支持!
来源: http://www.phperz.com/article/18/0117/352764.html