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(){
@Override
publicString 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 ...
随机推荐
- JavaEE(3) - RMI服务器和客户端
1. 开发RMI服务器 Net Beans创建java project: (qs) (Server.java) package server; import java.rmi.*; //远程接口必须集 ...
- Drupal 7.31 SQL注射分析POC
此漏洞昨日爆发 ,我们有时间去看看今天的代码. 于Drupal于,跑sql声明使用PDO型号,这是一般能够避免大部分的注射,由于使用占位符的sql语法语句是限制. 但是,这并不意味着绝对安全,. 在D ...
- 第7章 桥接模式(Bridge Pattern)
原文 第7章 桥接模式(Bridge Pattern) 定义: 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能 ...
- 从头开始学JavaScript (十)——垃圾收集
原文:从头开始学JavaScript (十)--垃圾收集 一.垃圾收集 1.1javascript垃圾收集机制: 自动垃圾收集,执行环境会负责管理代码执行过程中的使用的内存.而在C和C++之类的语言中 ...
- URAL 1404. Easy to Hack! (模拟)
space=1&num=1404">1404. Easy to Hack! Time limit: 1.0 second Memory limit: 64 MB When Vi ...
- javascript的语法作用域你真的懂了吗
原文:javascript的语法作用域你真的懂了吗 有段时间没有更新了,思绪一下子有点转不过来.正应了一句古话“一天不读书,无人看得出:一周不读书,开始会爆粗:一月不读书,智商输给猪.”.再加上周五晚 ...
- HDU 1102 Constructing Roads, Prim+优先队列
题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...
- Excel 创建31 个 工作表
Sub AddSheets() Dim i As Integer Dim DaysInt As Integer Dim NameStr As String DaysInt = DateAdd(, No ...
- JQuery日记6.5 Javascript异步模式(一)
理解力JQuery前实现异步队列,有必要理解javascript异步模式. Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行. 在多线程的语言中最 ...
- HTML静态分页(形如:首页,上一页,下一页,尾页)
在HTML中有时候我们会用到静态分页,一次拿回一定量的数据结果条目,我们会以形如:第2页,共12页 首页 上一页 下一页 尾页 的方式进行静态分页,以下是该种静态分页的代码,供兄弟姐妹们参考. &l ...