Atitit. Async await 優缺點 非同步編程的原理and實現 java c# php 1. async & await的來源1 2. 非同步編程history1 2.1. 線程池 2 2.2. 返回值2 2.3. Semaphore 信號量2 2.4. 線程的異常,主線程可以捕獲到麽2
Atitit. Async await 優缺點 非同步編程的原理and實現 java c# php
3. await並不是針對於async的方法,而是針對async方法所返回給我們的Task,2
1. async & await的來源
不個非同步的操作語言級別來完成.. 趨勢..
2. 非同步編程history
1. static void Main(){
2. new Thread(Go).Start(); // .NET 1.0開始就有的
3. Task.Factory.StartNew(Go); // .NET 4.0 引入了 TPL
4. Task.Run(new Action(Go)); // .NET 4.5 新增了一個Run的方法
5. }
6.
7. public static void Go(){
8. Console.WriteLine("我是另一個線程");
9. }
這裡面需要註意的是,創建Thread的實例之後,需要手動調用它的Start方法將其啟動。但是對於Task來說,StartNew和Run的同時,既會創建新的線程,並且會立即啟動它。
作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 漢字名:艾龍, EMAIL:[email protected]
轉載請註明來源: http://www.cnblogs.com/attilax/
2.1. 線程池
線程的創建是比較占用資源的一件事情,.NET 為我們提供了線程池來幫助我們創建和管理線程。Task是預設會直接使用線程池,但是Thread不會。如果我們不使用Task,又想用線程池的話,可以使用ThreadPool類。
2.2. 返回值
Thead是不能返回值的,但是作為更高級的Task當然要彌補一下這個功能。
2.3. Semaphore 信號量
我實在不知道這個單詞應該怎麼翻譯,從官方的解釋來看,我們可以這樣理解。它可以控制對某一段代碼或者對某個資源訪問的線程的數量,超過這個數量之後,其它的線程就得等待,只有等現在有線程釋放了之後,下麵的線程才能訪問。這個跟鎖有相似的功能,只不過不是獨占的,它允許一定數量的線程同時訪問。
2.4. 線程的異常,主線程可以捕獲到麽
3. await並不是針對於async的方法,而是針對async方法所返回給我們的Task,
await 實質是在調用awaitable對象的GetResult方法
這也是為什麼所有的async方法都必須返回給我們Task。所以我們同樣可以在Task前面也加上await關鍵字,這樣做實際上是告訴編譯器我需要等這個Task的返回值或者等這個Task執行完畢之後才能繼續往下走。
Task.GetAwaiter()和await Task 的區別?
Task.GetAwait()方法會給我們返回一個awaitable的對象,通過調用這個對象的GetResult方法就會掛起主線程,當然也不是所有的情況都會掛起。還記得我們Task的特性麽? 在一開始的時候就啟動了另一個線程去執行這個Task,當我們調用它的結果的時候如果這個Task已經執行完畢,主線程是不用等待可以直接拿其結果的,如果沒有執行完畢那主線程就得掛起等待了。
4. Java裡面的task 跟個 await
Java中的是個futureTask走十.net 中的task..
java還沒語法級別的await,,只可以當庫的模式實現..
FutureTask async_task=taskService.async(()->{
String echo1 = echoCmdResult_asStr(process.getInputStream());
System.out.println("--echo1:"+echo1);
returnecho1;
},10);
new Thread(async_task).start();
System.out.println("--start get err stream"+filex.getUUidName());
FutureTask async_task_err=taskService.async(()->{
String echo2 = echoCmdResult_asStr(process.getErrorStream());
System.out.println("--echo2:"+echo2);
returnecho2;
},10);
new Thread(async_task_err).start();
r=taskService.<String>await(async_task, 15, "$output_timeout_ex");
System.out.println("-- finish await std stream"+filex.getUUidName());
System.out.println("----------------------------------------");
System.out.println("--start await err stream"+filex.getUUidName());
String err=taskService.<String>await(async_task_err,1, "$err_stream_timeout_ex");
5. ---code
public FutureTask async(Callable object, int timeout_secs ) {
FutureTask<String> task = new FutureTask<String>(object);
this.timeout_secs=timeout_secs;
check_time_out(task);
return task;
}
public <t> t await(FutureTask<t> async_task, int timeout_secs2, Object defVal) {
try {
return async_task.get(timeout_secs2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
async_task.cancel(true);
}
return (t) defVal;
}
6. async & await的缺點
只對task型的效果....不能常用的code..
只好使用task +lambda包裝一哈...
FutureTask async_task_err=taskService.async(()->{
String echo2 = echoCmdResult_asStr(process.getErrorStream());
System.out.println("--echo2:"+echo2);
returnecho2;
},10);
new Thread(async_task_err).start();
String err=taskService.<String>await(async_task_err,1, "$err_stream_timeout_ex");
7. ref
async & await 的前世今生 - 51CTO.COM.htm