自從項目中語言換成Java后就很久沒有看C#了,但說實話我是身在曹營心在漢啊。早就知道.NET4.5新增了`async`和`await`但一直沒有用過,今天看到[這篇文章][1]總算有了點了解,突然發現`Task`這個玩意不就是Java中`Future`這個概念嗎? 這里冒昧引用下[Jesse Liu][2]文中的C#代碼: ``` static void Main(string[] args) { Console.WriteLine("Main Thread Id: {0}\r\n", Thread.CurrentThread.ManagedThreadId); Test(); Console.ReadLine(); } static async Task Test() { 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 Task GetName() { // 這里還是主線程 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代碼是不是“一模一樣”? ``` static ExecutorService service = Executors.newFixedThreadPool(10); /** * @param args * @throws ExecutionException * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException, ExecutionException { System.out.println("Main Thread Id: " + Thread.currentThread().getId()); test(); } static void test() throws InterruptedException, 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()); } static Future getName(){ System.out.println("Before calling ExecutorService.submit, current thread Id is: "+Thread.currentThread().getId()); return service.submit(new Callable() { @Override public String call() throws Exception { Thread.sleep(5000); System.out.println("'getName' Thread Id: "+Thread.currentThread().getId()); return "zhanjindong"; } }); } ``` 當然上面的代碼為了說明都冗余了點,輸出的結果自然也是一樣的: ![此處輸入圖片的描述][3] ![此處輸入圖片的描述][4] 說“等價”是因為無論是Task還是Future都是為了對異步操作進行封裝,Java中`Future.get`相當於C#中的`Task.Result`。`await name`不過是一個語法糖而已(但這語法糖很重要,async和await能讓我們以寫同步代碼的方式實現異步的邏輯)。做一件正確的事的思路往往是一樣的,但是實現的細節總是有差別。這次我倒似乎更喜歡Java中Future這個名詞,直觀明了。但C#還是一如既往的諱莫如深([不過已經進步很大了][5]),這一點也是經常遭業界同仁所詬病,還好我有IL: ![此處輸入圖片的描述][6] 咦?狀態機讓我立馬想到了[yield return][7],怪不得我覺得`await`和`yield return`有點神似呢。這也許就是我更喜歡C#的原因:設計上的**一致性**。 簡單寫點,有時間還是想深入深入啊。 PS:搭了個自己的博客[http://zhanjindong.info/][8],有什么不對的地方歡迎各位來這里拍磚。 [1]: http://www.cnblogs.com/jesse2013/p/3560999.html# [2]: http://www.cnblogs.com/jesse2013/p/3560999.html#parameters [3]: http://zhanjindong.info/wp-content/uploads/2014/03/c-result.png [4]: http://zhanjindong.info/wp-content/uploads/2014/03/Java-result.png [5]: http://referencesource.microsoft.com/ [6]: http://zhanjindong.info/wp-content/uploads/2014/03/state-machine.png [7]: http://zhanjindong.info/2013/09/01/%E5%8F%AF%E6%83%9Cjava%E4%B8%AD%E6%B2%A1%E6%9C%89yield-return/ [8]: http://zhanjindong.info/2014/03/08/charp-task-and-java-future/