C#的Task和Java的Future
自从项目中语言换成Java后就很久没有看C#了,但说实话我是身在曹营心在汉啊。早就知道.NET4.5新增了async和await但一直没有用过,今天看到这篇文章总算有了点了解,突然发现Task这个玩意不就是Java中Future这个概念吗?
这里冒昧引用下Jesse Liu文中的C#代码:
staticvoidMain(string[] args){Console.WriteLine("Main Thread Id: {0}\r\n",Thread.CurrentThread.ManagedThreadId);Test();Console.ReadLine();}static async TaskTest(){Console.WriteLine("Before calling GetName, Thread Id: {0}\r\n",Thread.CurrentThread.ManagedThreadId);var name =GetName();Console.WriteLine("End calling GetName.\r\n");Console.WriteLine("Get result from GetName: {0}", await name);}static async TaskGetName(){// 这里还是主线程Console.WriteLine("Before calling Task.Run, current thread Id is: {0}",Thread.CurrentThread.ManagedThreadId);return await Task.Run(()=>{Thread.Sleep(5000);Console.WriteLine("'GetName' Thread Id: {0}",Thread.CurrentThread.ManagedThreadId);return"zhanjindong";});}
大家看下"等价"的Java代码是不是“一模一样”?
staticExecutorService service =Executors.newFixedThreadPool(10);/*** @param args* @throws ExecutionException* @throws InterruptedException*/publicstaticvoid main(String[] args)throwsInterruptedException,ExecutionException{System.out.println("Main Thread Id: "+Thread.currentThread().getId());test();}staticvoid test()throwsInterruptedException,ExecutionException{System.out.println("Before calling getName, Thread Id: "+Thread.currentThread().getId());Future name = getName();System.out.println("End calling getName.");System.out.println("Get result from getName: "+ name.get());}staticFuture getName(){System.out.println("Before calling ExecutorService.submit, current thread Id is: "+Thread.currentThread().getId());return service.submit(newCallable(){@OverridepublicString call()throwsException{Thread.sleep(5000);System.out.println("'getName' Thread Id: "+Thread.currentThread().getId());return"zhanjindong";}});}
当然上面的代码为了说明都冗余了点,输出的结果自然也是一样的:

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

咦?状态机让我立马想到了yield return,怪不得我觉得await和yield return有点神似呢。这也许就是我更喜欢C#的原因:设计上的一致性。
简单写点,有时间还是想深入深入啊。
C#的Task和Java的Future的更多相关文章
- 彻底理解Java的Future模式
先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...
- Java使用Future设置方法超时
1.使用线程包 java.util.concurrent.Future 2.Future代表一个异步计算的结果. 它提供了方法来检查是否计算已经完成,还是正在计算而处于等待状态,并且也提供了获取计算结 ...
- Java Callable Future Example(java 关于Callable,Future的例子)
Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...
- java中Future的使用
文章目录 创建Future 从Future获取结果 取消Future 多线程环境中运行 java中Future的使用 Future是java 1.5引入的一个interface,可以方便的用于异步结果 ...
- Java的Future接口
Java的Future接口 Java 中的 Future 接口和其实现类 FutureTask,代表了异步计算的结果. 1. Future接口简介 Future 是异步计算结果的容器接口,它提供了下面 ...
- Java多线程Future模式
Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分 ...
- Java 多线程 - Future
Java中Future的使用场景和解析 https://blog.csdn.net/hongtaolong/article/details/83349705 (细看!!!)
- Java 多线程Future和FutureTask
Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. Future接口源码: public interface Future<V> ...
- java中Future与FutureTask使用与分析
Future与FutureTask都是用于获取线程执行的返回结果.下面我们就对两者之间的关系与使用进行一个大致的介绍与分析 一.Future与FutureTask介绍: Future位于java.ut ...
随机推荐
- android工程实现换壁纸功能(转)
最近工作要实现换壁纸小功能,将代码做成demo发出来 没有采用zip格式换肤,因为只是更换一张图片背景 1.将三张图放入drawable-hdpi,我放的是480*800的 2.用sharedPref ...
- poj 3400 Dropping the stones
//next_permutation全阵列 # include <stdio.h> # include <algorithm> # include <string.h&g ...
- kendo ui 单击取消编辑数据grid减少的原因和治疗方法的数据
kendo ui单击取消编辑数据buttongrid数据缩减.原因grid编辑数据追打datasorce于data寻找阵列数据的存在.假定有不会加入,加入缺席. 首先一个样本: html代码: < ...
- C# 你不能调用的问题剪贴板线程
最近在做一个项目,需要使用线程,并使用剪贴板,头发得到较少的数据在剪贴板上后,现在的孩子线程创建一个子线程,我特别困惑,上网查资料.最后,得到最终的.下面的例子现在将概括解: 第一步: public ...
- 利用BBED恢复UPDATE改动前的值
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/30615151 实验步骤例如以下: 1.创建表guo_test1 gyj@PROD> ...
- NYoj 最舒适的路线
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=711 分析:枚举速度最大的边,找出能够从S到达T的最大速度,然后求出它们的比值,与已 ...
- UML之轻松入门(2)-掌握Junit,让我们的开发更高效
使用UML不仅能够形象化的表达我们的程序思想,并且能够帮助我们提高程序的质量.一个杂乱无章的程序让维护者望而生畏,其成本也可想而知.在面向程序设计(OOD)中有5条原则是帮助我们设计一个高效 ...
- ReactJS.NET
初探ReactJS.NET 开发 ReactJS通常也被称为"React",是一个刚刚在这场游戏中登场的新手.它由Facebook创建,并在2013年首次发布.Facebook认为 ...
- Appium:通过wifi连接Android设备
1.首先用USB连接你的Android设备,然后在终端运行命令,它可以启动设备的5555端口使其在网络上可以连接. adb tcpip 2.现在断开USB连接,然后确保设备和你的电脑连接同一个无线网络 ...
- 使用Visual Studio创建映像向导(Image Sprite)——Web Essential
原版的:Creating Image Sprite in Visual Studio - Web Essential 译者注:有关图片精灵的信息请參阅http://baike.baidu.com/vi ...