2016-09-29 76 views
0

在Java中,有什麼方法可以在線程內調用和處理異步方法嗎?如何在java線程內調用異步方法?

考慮一種情況,其中線程體內部的一種方法需要更多時間來執行它。因此,線程完成需要更多時間。

我已經嘗試了一些使用像FutureTask和Executors這樣的併發包類的例子。

是否有可能實現和處理異步方法內的所有異常?是否有可能獲得成功或錯誤響應,如AJAX成功和JavaScript錯誤處理程序?

我們將如何確保異步方法是否成功執行(有或沒有父線程上下文)?異步方法和父線程之間的通信的

+3

當然。即使在最簡單的情況下,您也擁有主線程,因此如果您可以根本不同步地調用方法,則可以從線程中調用它們。 'java.util.concurrent'包絕對是最好的開始。 – Kayaman

+0

但是,我們將如何確保異步方法執行成功與否?你能舉一個這個場景的例子嗎? –

+1

與同步方法相同。返回值或例外。由於異步性質,異常處理有點不同,但它都在文檔中。 – Kayaman

回答

0

最自然的方式是CompletableFuture標準類:

import java.util.concurrent.CompletableFuture; 
import java.util.concurrent.ExecutionException; 

public class AsyncExample { 
    String input; // common data 

    // async method 
    public String toLower() { 
     return input.toLowerCase(); 
    } 

    // method on main thread 
    public void run() { 
     input = "INPUT"; // set common data 
     try { 
      // start async method 
      CompletableFuture<String> future = CompletableFuture.supplyAsync(this::toLower); 
      // here we can work in parallel 
      String result = future.get(); // get the async result 
      System.out.println("input="+input+"; result="+result); 
     } catch (InterruptedException | ExecutionException e) { 
     } 
    } 

    public static void main(String[] args) { 
     new AsyncExample().run(); 
    } 
} 

。注意,Executor,包括在實施例中使用的默認執行的創建和升溫,需要一些時間(50 ms),因此您可能需要預先創建並加熱一個,例如通過提供一個空的方法:

 CompletableFuture.supplyAsync(()->null).get();