浅析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接口:
@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; }
2.runnable接口:
@functionalinterface public interface runnable { public abstract void run(); }
从上面的定义,我们可以看出,两者最大的区别就是对应的执行方法是否有返回值。callable接口中call方法具有返回值,这便是为什么我们可以通过callable接口来得到一个线程执行的返回值或者是异常信息。
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,希望对大家有所帮助
上一篇: Android拨打电话功能实例详解
推荐阅读
-
浅析Java和Scala中的Future
-
JAVA中堆、栈,静态方法和非静态方法的速度问题
-
java数据结构和算法中数组的简单入门
-
Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理
-
Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理
-
详解Java8新特性之interface中的static方法和default方法
-
Java中自增和自减操作符(++/--)的那些事
-
java web学习_浅谈request对象中get和post的差异
-
详谈Java泛型中T和问号(通配符)的区别
-
Java+Testlink实现接口自动化测试-7-获取用例期待结果和步骤中的Json信息