Java多线程 - Future模式转换成ListenableFuture模式,以及AsyncRestTemplate的原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/daijiguo/article/details/85099585
今日推荐