如何在java线程中调用异步方法?

时间:2016-09-29 16:57:56

标签: java multithreading asynchronous

在Java中,有没有办法在线程内调用和处理异步方法?

考虑一种情况,其中线程主体内部的一个方法需要更多时间来执行它。因此,线程完成需要更多时间。

我通过使用FutureTask和Executors等并发包类尝试了一些例子。

是否可以在异步方法中实现和处理所有异常?是否有可能在JavaScript中获得成功或错误响应,如AJAX成功和错误处理程序?

我们如何确保异步方法是否成功执行(有或没有父线程上下文)?

1 个答案:

答案 0 :(得分: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毫秒),因此您可能需要事先创建并加热一个,例如:通过提供一个空方法:

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