2016-09-29 35 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();