程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Atitit. Async await 優缺點 異步編程的原理and實現 java c# php,

Atitit. Async await 優缺點 異步編程的原理and實現 java c# php,

編輯:JAVA綜合教程

Atitit. Async await 優缺點 異步編程的原理and實現 java c# php,


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

3. await並不是針對於async的方法,而是針對async方法所返回給我們的Task,2

4. Java裡面的task 跟個 await3

5. ---code4

6. async & await的缺點4

7. ref5

 

 

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

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