浅析Java和Scala中的Future

 更新时间:2017年10月26日 16:36:19   投稿:mrr  
这篇文章主要介绍了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,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Springboot实现异步任务线程池代码实例

    Springboot实现异步任务线程池代码实例

    这篇文章主要介绍了Springboot实现异步任务线程池代码实例,异步任务线程池是一种用于处理异步任务的机制,它可以提高程序的并发性能和响应速度,通过将任务提交给线程池,线程池会自动管理线程的创建和销毁,从而避免了频繁创建和销毁线程的开销,需要的朋友可以参考下
    2023-10-10
  • Java探索之Hibernate主键生成策略详细介绍

    Java探索之Hibernate主键生成策略详细介绍

    这篇文章主要介绍了Java探索之Hibernate主键生成策略详细介绍,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Idea中如何修改项目的SVN地址

    Idea中如何修改项目的SVN地址

    这篇文章主要介绍了Idea中如何修改项目的SVN地址问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 详解Spring Boot 目录文件结构

    详解Spring Boot 目录文件结构

    这篇文章主要介绍了Spring Boot 目录文件结构的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java Stream流使用最多的方式示例详解

    Java Stream流使用最多的方式示例详解

    在 Java 编程中,Stream 流提供了一种高效、便捷的方式来处理集合数据,本文将详细介绍 Java 中 Stream 流的用法,包括基础用法、中级用法、高级用法以及一些特殊方法的使用,感兴趣的朋友一起看看吧
    2024-12-12
  • Java面向对象的三大特征

    Java面向对象的三大特征

    这篇文章主要给大家结合相关示例介绍了Java面向对象的三大特征:封装、继承、多态,非常的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • Springboot如何根据实体类生成数据库表

    Springboot如何根据实体类生成数据库表

    这篇文章主要介绍了Springboot如何根据实体类生成数据库表的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java正则表达式处理花括号内容替换赋值问题

    java正则表达式处理花括号内容替换赋值问题

    这篇文章主要介绍了java正则表达式处理花括号内容替换赋值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 使用Enumeration和Iterator遍历集合类详解

    使用Enumeration和Iterator遍历集合类详解

    Enumeration和Iterator接口功能相似,而且Iterator的功能还比Enumeration多,那么为什么还要使用Enumeration
    2013-09-09
  • 通过JDBC连接oracle数据库的十大技巧

    通过JDBC连接oracle数据库的十大技巧

    通过JDBC连接oracle数据库的十大技巧...
    2006-12-12

最新评论