Java併發之構建非同步任務
阿新 • • 發佈:2019-02-18
有個小朋友表示我寫的併發文章,不夠細,看了還是不太明白。
我的寫作水平實在有限,淚奔。
後面我儘量寫的詳細簡單,儘量多講點例子。
非同步對應的就是同步。
同步的程式大家寫的非常的多,同步就是指程式對所有的操作都是序列的處理。一系列的任務A,B,C,D…必須一個一個的處理。
而非同步則是可以併發同時處理多個任務。
舉個栗子吧。
某個網站的使用者提交註冊需要以下幾步:
1,呼叫使用者服務,寫入資料庫-需要1s
2,傳送郵件-需要1s
3, 傳送簡訊-需要1s
如果是同步的程式,序列執行,則使用者一共需要等代3s
但是我們注意到,這三個任務相互之間沒有依賴關係,可以改成非同步併發的來執行,則使用者等待的時間一共只需要1s.
非同步通常代表著更高的效能和更好的系統資源利用率。
有幾種方法可以構建非同步的任務
1, Thread和Runnable介面。
Runnable是最基本任務表現形式,但不能返回值。
Thread thread1 = new Thread(
new Runnable(){
public void run(){
//寫入資料庫
}
}
);
thread1.start();
Thread thread2 = new Thread(
new Runnable(){
public void run(){
//傳送郵件
}
}
);
thread4.start();
Thread thread3 = new Thread(
new Runnable(){
public void run(){
//傳送郵件
}
}
);
thread3.start();
2, Future
Future表示一個任務的生命週期:
1)提供了相應的方法來判斷任務是否已經完成或者取消;
2)還能獲取任務的結果;
3)可以取消任務。
最常用的是通過ExecutorService的submit方法提交任務,會返回一個Future。
ExecutorService的submit方法可以提交Runnable和Callable任務;
對於Callable任務,Future的get方法可以獲得返回值。
ExecutorService executorService = Executors.newFixedThreadPool(10);
//定義Callable, 返回一個結果
Callable<Integer> task = ()->{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 5;
};
Future<Integer> future = executorService.submit(task);
Integer result = future.get();
System.out.println(result);
在實際的開發中,對於耗時比較長得操作,都可以考慮非同步的方式來執行。
一方面可以大大提高資源利用率和效能;
並且對於使用者互動的任務,可以大大減少使用者的等待時間,提升使用者體驗。