C#的Task和Java的Future

自从项目中语言换成Java后就很久没有看C#了,但说实话我是身在曹营心在汉啊。早就知道.NET4.5新增了asyncawait但一直没有用过,今天看到这篇文章总算有了点了解,突然发现Task这个玩意不就是Java中Future这个概念吗?

这里冒昧引用下Jesse Liu文中的C#代码:

  1. staticvoidMain(string[] args)
  2. {
  3. Console.WriteLine("Main Thread Id: {0}\r\n",Thread.CurrentThread.ManagedThreadId);
  4. Test();
  5. Console.ReadLine();
  6. }
  7. static async TaskTest()
  8. {
  9. Console.WriteLine("Before calling GetName, Thread Id: {0}\r\n",Thread.CurrentThread.ManagedThreadId);
  10. var name =GetName();
  11. Console.WriteLine("End calling GetName.\r\n");
  12. Console.WriteLine("Get result from GetName: {0}", await name);
  13. }
  14. static async TaskGetName()
  15. {
  16. // 这里还是主线程
  17. Console.WriteLine("Before calling Task.Run, current thread Id is: {0}",Thread.CurrentThread.ManagedThreadId);
  18. return await Task.Run(()=>
  19. {
  20. Thread.Sleep(5000);
  21. Console.WriteLine("'GetName' Thread Id: {0}",Thread.CurrentThread.ManagedThreadId);
  22. return"zhanjindong";
  23. });
  24. }

大家看下"等价"的Java代码是不是“一模一样”?

  1. staticExecutorService service =Executors.newFixedThreadPool(10);
  2. /**
  3. * @param args
  4. * @throws ExecutionException
  5. * @throws InterruptedException
  6. */
  7. publicstaticvoid main(String[] args)throwsInterruptedException,ExecutionException{
  8. System.out.println("Main Thread Id: "+Thread.currentThread().getId());
  9. test();
  10. }
  11. staticvoid test()throwsInterruptedException,ExecutionException{
  12. System.out.println("Before calling getName, Thread Id: "+Thread.currentThread().getId());
  13. Future name = getName();
  14. System.out.println("End calling getName.");
  15. System.out.println("Get result from getName: "+ name.get());
  16. }
  17. staticFuture getName(){
  18. System.out.println("Before calling ExecutorService.submit, current thread Id is: "+Thread.currentThread().getId());
  19. return service.submit(newCallable(){
  20. @Override
  21. publicString call()throwsException{
  22. Thread.sleep(5000);
  23. System.out.println("'getName' Thread Id: "+Thread.currentThread().getId());
  24. return"zhanjindong";
  25. }
  26. });
  27. }

当然上面的代码为了说明都冗余了点,输出的结果自然也是一样的:

 

说“等价”是因为无论是Task还是Future都是为了对异步操作进行封装,Java中Future.get相当于C#中的Task.Resultawait name不过是一个语法糖而已(但这语法糖很重要,async和await能让我们以写同步代码的方式实现异步的逻辑)。做一件正确的事的思路往往是一样的,但是实现的细节总是有差别。这次我倒似乎更喜欢Java中Future这个名词,直观明了。但C#还是一如既往的讳莫如深(不过已经进步很大了),这一点也是经常遭业界同仁所诟病,还好我有IL:

咦?状态机让我立马想到了yield return,怪不得我觉得awaityield return有点神似呢。这也许就是我更喜欢C#的原因:设计上的一致性

简单写点,有时间还是想深入深入啊。

C#的Task和Java的Future的更多相关文章

  1. 彻底理解Java的Future模式

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  2. Java使用Future设置方法超时

    1.使用线程包 java.util.concurrent.Future 2.Future代表一个异步计算的结果. 它提供了方法来检查是否计算已经完成,还是正在计算而处于等待状态,并且也提供了获取计算结 ...

  3. Java Callable Future Example(java 关于Callable,Future的例子)

    Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...

  4. java中Future的使用

    文章目录 创建Future 从Future获取结果 取消Future 多线程环境中运行 java中Future的使用 Future是java 1.5引入的一个interface,可以方便的用于异步结果 ...

  5. Java的Future接口

    Java的Future接口 Java 中的 Future 接口和其实现类 FutureTask,代表了异步计算的结果. 1. Future接口简介 Future 是异步计算结果的容器接口,它提供了下面 ...

  6. Java多线程Future模式

    Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分 ...

  7. Java 多线程 - Future

    Java中Future的使用场景和解析 https://blog.csdn.net/hongtaolong/article/details/83349705 (细看!!!)

  8. Java 多线程Future和FutureTask

    Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. Future接口源码: public interface Future<V> ...

  9. java中Future与FutureTask使用与分析

    Future与FutureTask都是用于获取线程执行的返回结果.下面我们就对两者之间的关系与使用进行一个大致的介绍与分析 一.Future与FutureTask介绍: Future位于java.ut ...

随机推荐

  1. 详细解释VB连接access几种方法数据库

    在VB中,连接ACCESS数据库的方法主要有以下三种 使用ADO对象,通过编写代码訪问数据库 Connection 对象 ODBC数据源 使用ADO Data 控件高速创建数据库连接 有三种连接方法 ...

  2. 使用Hadoop的MapReduce与HDFS处理数据

    hadoop是一个分布式的基础架构,利用分布式实现高效的计算与储存,最核心的设计在于HDFS与MapReduce,HDFS提供了大量数据的存储,mapReduce提供了大量数据计算的实现,通过Java ...

  3. Parse 和 Swift 搭建一个像 Instagram

    如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?   [编者按]本篇文章作者是Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客 ...

  4. Select与SelectMany的区别

    Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值. Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Se ...

  5. .NET 对象序列化和系列化德

    DataSet ds = new DataSet(); //给ds赋值(省略) byte[] b = this.Serialize(ds); DataSet d1 = this.DeSerialize ...

  6. auto tool: make -2014-1210-0001

    /* *Author : DavidLin *Date : 2014-12-10pm *Email : linpeng1577@163.com or linpeng1577@gmail.com *wo ...

  7. spring data jpa使用懒操作

    如果model对象的某属性使用lazy load,调用这个属性时会报错, failed to lazily initialize a collection of role could not init ...

  8. Jenkins + robot framework自动发送邮件报告

    一.Jenkins安装插件 进入系统管理—插件管理—可选插件下安装以下插件Email-ext plugin.Email-ext Template Plugin. 安装完如下: 二.系统设置 1.设置系 ...

  9. kobox : key_waitqueue.c -v1 如何内核线程,如何使用等待队列

    平台:TQ2440 按键驱动 (1)在init中创建一个内核线程作为等待队列的处理函数,该内核线程是一个while(1)死循环,一直检測等待队列的触发条件 DECLARE_WAIT_QUEUE_HEA ...

  10. CQRS(命令查询职责分离)和 EDA(事件驱动架构)

    转载CQRS(命令查询职责分离)和 EDA(事件驱动架构) 上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动 ...