程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Atitit.異步編程的發展歷史 1.1. TAP & async/await,atitit1.1.

Atitit.異步編程的發展歷史 1.1. TAP & async/await,atitit1.1.

編輯:JAVA綜合教程

Atitit.異步編程的發展歷史 1.1. TAP & async/await,atitit1.1.


 Atitit.異步編程的發展歷史 1.1. TAP & async/await

 

 

 

1. 異步編程的發展歷史1

1.1. Thread1

1.2. Task1

1.3. Async await2

1.3.1. await 的原形2

2. 常見的異步模式主要有callbaks,listeners(一種觀察者模式),promise,3

3. 實現異步編程有4種方法可供選擇,這4種訪求實際上也對應著4種異步調用的模式,分為“等待”和“回調”兩大類。4

3.1. APM4

3.2. EAP5

3.3. TAP & async/await5

3.4. async/await這兩個新增的關鍵字只是語法糖,編譯後的代碼不新建線程 5

4. 參考6

 

 

1. 異步編程的發展歷史

1.1. Thread

 

1.2. Task

 

 

返回值

Thead是不能返回值的,但是作為更高級的Task當然要彌補一下這個功能。

1. static void Main() {  

2.     // GetDayOfThisWeek 運行在另外一個線程中  

3.     var dayName = Task.Run<string>(() => { return GetDayOfThisWeek(); });  

4.     Console.WriteLine("今天是:{0}",dayName.Result);  

5. } 

 

 

1.3. Async await

 

不知道如何去處理了。那今天我們就來好好看看這兩兄弟和他們的叔叔(Task)爺爺(Thread)們到底有什麼區別和特點,本文將會對Thread 到 Task 再到 .NET 4.5的 async和 await,這三種方式下的並行編程作一個概括性的介紹包括:開啟線程,線程結果返回,線程中止,線程中的異常處理等。

 

Task是默認會直接使用線程池,但是Thread不會。如果我們不使用Task,又想用線程池的話,可以使用ThreadPool類。

 

作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 漢字名:艾龍,  EMAIL:[email protected]

轉載請注明來源: http://www.cnblogs.com/attilax/

 

 

1.3.1. await 的原形

await後的的執行順序 

感謝 locus的指正, await 之後不會開啟新的線程(await 從來不會開啟新的線程),所以上面的圖是有一點問題的。

await 不會開啟新的線程,當前線程會一直往下走直到遇到真正的Async方法(比如說HttpClient.GetStringAsync),這個方法的內部會用Task.Run或者Task.Factory.StartNew 去開啟線程。也就是如果方法不是.NET為我們提供的Async方法,我們需要自己創建Task,才會真正

await並不是針對於async的方法,而是針對async方法所返回給我們的Task,這也是為什麼所有的async方法都必須返回給我們Task。所以我們同樣可以在Task前面也加上await關鍵字,這樣做實際上是告訴編譯器我需要等這個Task的返回值或者等這個Task執行完畢之後才能繼續往下走。

 

Task.GetAwait()方法會給我們返回一個awaitable的對象,通過調用這個對象的GetResult方法就會掛起主線程,當然也不是所有的情況都會掛起。還記得我們Task的特性麼? 在一開始的時候就啟動了另一個線程去執行這個Task,當我們調用它的結果的時候如果這個Task已經執行完畢,主線程是不用等待可以直接拿其結果的,如果沒有執行完畢那主線程就得掛起等待了。

await 實質是在調用awaitable對象的GetResult方法

1. / 這裡主線程會掛起等待,直到task執行完畢我們拿到返回結果  

2.     var result = task.GetAwaiter().GetResult();    

3.     // 這裡不會掛起等待,因為task已經執行完了,我們可以直接拿到結果  

4.     var result2 = await task;       

 

 

 

 

 

Java has a class called java.util.concurrent.Future which is equivalent to the C# Task class.

You can set off work on a java.util.concurrent.Executor object. There are many implementations but ForkJoinTask.fork() is worth a look if you hit thread limits as soon as you try this.

You will be given a Future when you start work. Your method will carry on running. When you need the result from your Future you call get() and it will block until the result is ready. This is similar to using the await keyword in C#.

2. 常見的異步模式主要有callbaks,listeners(一種觀察者模式),promise,

listeners這也是一種常見的異步編程方式,如:

$elem.on('click',doClick);function doClick(){      //do something};

設計模式中將這種方式稱之為命令模式。這種方式的好處是你可以注冊多個事件,待事件觸發時調用注冊的函數。

Promise異步編程總結起來就是實現了thenable,說的更直白的一點就是我跟你是好朋友,我可能有事需要你幫忙,你隨時候著吧,有需要我會第一時間通知你。你跟小王也是好哥們,並同樣告訴你需要他幫忙,並第一時間通知他。當然你通知他是在我通知你以後。用偽代碼表示:

myself(function(){          callXiaoLi();    })    .then(function(){         //我是小李,你喊我了,我就去喊小王         callXiaowang();    })    .then(function(){ console.log('我是小王');  });

then實現比較繞,需要解釋一下,如:.then(xx).then()

每次.then時會生成一個新的promise對象, 就是說後一個then是注冊給上一個promise對象的,其出發條件依賴於上一個.then時生成的promise。

如果上一個.then 最後返回結果是非promise對象(即沒有then方法),則直接 resolve

如果上一個.then最後返回的結果是promise對象,那.then生成的promise必須依賴返回結果中的promise,及內層的 promise.then( ".then時生成的promise".resolve)

3. 實現異步編程有4種方法可供選擇,這4種訪求實際上也對應著4種異步調用的模式,分為“等待”和“回調”兩大類。

 

3.1. APM

C# .NET最早出現的異步編程模式被稱為APM(Asynchronous Programming Model)。這種模式主要由一對Begin/End開頭的組成。BeginXXX方法用於啟動一個耗時操作(需要異步執行的代碼段)

3.2. EAP

在C# .NET第二個版本中,增加了一種新的異步編程模型EAP(Event-based Asynchronous Pattern),EAP模式的異步代碼中,典型特征是一個Async結尾的方法和Completed結尾的事件。XXXCompleted事件將在異步處理完成時被觸發,在事件的處理函數中可以操作異步方法的結果。往往在EAP代碼中還會存在名為CancelAsync的方法用來取消異步操作,以及一個ProgressChenged結尾的事件用來匯報操作進度。通過這種方式支持取消和進度匯報也是EAP比APM更有優勢的地方。通過後文TAP的介紹,你會發現EAP中取消機制沒有可延續性,並且不是很通用

3.3. TAP & async/await

從.NET4.0開始新增了一個名為TPL的庫主要負責異步和並行操作的處理,目標就是使異步和並發操作有個統一的操作界面。TPL庫的核心是Task類,有了Task幾乎不用像之前版本的異步和並發那樣去和Thread等底層類打交道,作為使用者的我們只需要處理好Task,Task背後有一個名為的TaskScheduler的類來處理Task在Thread上的執行。可以這樣說TaskScheduler和Task就是.NET4.0中異步和並發操作的基礎,也是我們寫代碼時不二的選擇。

3.4. async/await這兩個新增的關鍵字只是語法糖,編譯後的代碼不新建線程

await 不會開啟新的線程,當前線程會一直往下走直到遇到真正的Async方法(比如說HttpClient.GetStringAsync),這個方法的內部會用Task.Run或者Task.Factory.StartNew 去開啟線程。也就是如果方法不是.NET為我們提供的Async方法,我們需要自己創建Task,才會真正的去創建線程。

4. 參考

async & await 的前世今生 - 51CTO.COM.htm

你所必須掌握的三種異步編程方法callbacks,listeners,promise_JavaScript_第七城市.htm

.NET異步編程總結----四種實現模式 - DebugLZQ - 博客園.htm

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved