任务完成前Java返回

时间:2015-12-24 08:24:04

标签: java asynchronous asynchttpclient

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果您使用的是Spring,那么它非常简单,没有任何样板代码。看一下Spring中的@Async支持。这是一个非常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" />

答案 2 :(得分:0)

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

答案 3 :(得分:0)

尝试使用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
                                }
                        }); 

`