1. 程式人生 > >Java併發之構建非同步任務

Java併發之構建非同步任務

有個小朋友表示我寫的併發文章,不夠細,看了還是不太明白。
我的寫作水平實在有限,淚奔。
後面我儘量寫的詳細簡單,儘量多講點例子。

非同步對應的就是同步。
同步的程式大家寫的非常的多,同步就是指程式對所有的操作都是序列的處理。一系列的任務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);

在實際的開發中,對於耗時比較長得操作,都可以考慮非同步的方式來執行。
一方面可以大大提高資源利用率和效能;
並且對於使用者互動的任務,可以大大減少使用者的等待時間,提升使用者體驗。