版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daijiguo/article/details/85099585
一、AsyncRestTemplate Demo:
spring4.0提供了RestTemplate
的异步调用版本AsyncRestTemplate
,用其进行异步调用的demo如下:
MultiValueMap headers = new LinkedMultiValueMap(){
{
add("Content-Type", "application/json; charset=UTF-8");
}
}
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
HttpEntity<Object> httpEntity = new HttpEntity<Object>(jsonStr, headers);
Listenable<ResponseEntity<String>> future = asyncRestTemplate.postForEntity(url, httpEntity, String.class);
future.addCallback(new ListenableFutureCallback<ResponseEntity<String>>(){
@Override
public void onFailure(Throwable throwable){
System.out.println(throwable.getMessage());
}
@Override
public void onSuccess(ResponseEntity<String> rs){
//System.out.println(rs.getBody());
System.out.println("回调线程:"+Thread.currentThread().getName());
System.out.println(111111);
}
})
//jsonStr是json字符串
System.out.println("主线程:"+Thread.currentThread().getName());
System.out.println(222222);
二、执行结果:
主线程:http-nio-8097-exec-1
222222
回调线程:SimpleAsyncTaskExecutor-1
111111
三、结果分析:
ListenableFuture与Future的共同点:
ListenableFuture
接口继承自Future
接口,根据文章Java多线程 - Future模式,我们很合理的知道,ListenableFuture
模式也会像Future
模式一样,另起一个线程去执行任务,由以上的实验可知,回调函数的执行,确实是在不同于主线程的另一个线程SimpleAsyncTaskExecutor-1
中执行的。
ListenableFuture与Future的不同点:
如果看了这篇文章Java多线程 - Future模式,你就会知道主线程在等待Future
对象拿到返回值的时候,是会被子线程阻塞的,这大大浪费了主线程的性能。而ListenableFuture
,支持回调,主线程可以自己做自己的事情,甚至提前结束,等子线程完成任务后自然会执行回调函数中的代码。
何为回调?私以为就是在某个线程中,传入一个自定义函数,等线程任务执行完,自然会去调用你定义的函数。具体可参考这篇文章回调函数定义
四、Future模式转换成ListenableFuture模式
虽然此处是文章正题,但笔者不想多做解释,可参考该篇文章ListenableFuture in Guava,文章中提到的Executor和ExecutorService的关系可参考这篇文章Java多线程学习(8)执行器
参考:
https://blog.csdn.net/lin74love/article/details/81138134
https://www.cnblogs.com/hupengcool/p/3991310.html