Java 在任务完成前返回

Java returning before tasks complete

我有一个方法,它调用了另一个方法,结果并不重要。确切地说,它是对 Web 服务的 POST 请求,结果在该方法中处理,而不是在调用方法中处理。现在我希望 main 方法在该任务完成之前 return。

本质上,我需要某种异步性。我可以在 Java 中使用哪些工具?下面是步骤:

  1. 方法A调用方法B
  2. 方法 B 开始执行(我们对方法 b 的结果不感兴趣:它调用 Web 服务并自行处理结果)
  3. 方法 A return 方法 B 完成前

您可以使用 CompletableFuture.runAsync() 异步调用方法 B。

如果您想在方法 B 退出时执行某些操作,您可以通过调用 .thenRun() 返回的 future 添加回调

new Thread(new Runnable() {
    public void run() {
        //Do whatever
    }
}).start();

尝试使用AsyncHttpClient,例子

`AsyncHttpClient asyncHttpClient = new AsyncHttpClient(
                                builder.setFollowRedirect(true).
                                setWebSocketTimeout(120000).
                                setAcceptAnyCertificate(true).
                                setMaxConnections(100).
                                setMaxRequestRetry(3).
                                setReadTimeout(120000).
                                setConnectTimeout(120000).
                                setRequestTimeout(120000).
                                build()); 
asyncHttpClient.prepareGet(url).execute(new AsyncCompletionHandler<Response>(){
                                @Override
                                public Response onCompleted(Response response) throws Exception{
                                      //your logic here
                                    }

                                @Override
                                public void onThrowable(Throwable t){
                                    //your logic here
                                }
                        }); 

`

如果您使用的是 Spring,那么它非常简单,无需任何样板代码。查看 @Async support in Spring. Here is a very simple example 以快速入门。

@Service
public class YourClass {
    public void methodA() {
        methodB();
    }

    @Async
    public void methodB() {
        // Your POST logic
    }
}

要在您的 xml 配置中启用 async 支持,您需要具有如下内容

<task:annotation-driven />
<task:executor id="defaultAsyncTaskExecutor" pool-size="5-15" queue-capacity="100" />