NutzCN Logo
问答 经测试,@Async 支持具有返回值的方法
发布于 408天前 作者 hcxxiaomo 267 次浏览 复制 上一个帖子 下一个帖子
标签:

看到文档里面有说明@Async不能有返回值,但是我稍微改造了一下就可以支持返回值。
1、增加了一个Pojo继续Future 来接收返回值

public class AsyncResult<V> implements Future<V> {

	private final V value;

	public AsyncResult(V value) {
		this.value = value;
	}

	public boolean cancel(boolean mayInterruptIfRunning) {
		return false;
	}

	public boolean isCancelled() {
		return false;
	}

	public boolean isDone() {
		return true;
	}

	public V get() {
		return this.value;
	}

	public V get(long timeout, TimeUnit unit) {
		return this.value;
	}

}

2、对应的Service

@IocBean
public class TestAsyncService {

	@Async
	public Future<String> testAsync1(int i){
		System.out.println(Thread.currentThread().getName());
		return new AsyncResult<String>("testAsync-->out"+i);
	}
	
}

3、 调用方的代码(此处是用JUnit的)

  @Test
    public void testAsync1() throws InterruptedException, ExecutionException{
    	 List< Future<String>> lsitFuture = new ArrayList<Future<String>>();
    	for (int i = 0; i < 5; i++) {
    		lsitFuture.add(testAsyncService.testAsync1(i));
    	}
    
    	for (Future<String> future : lsitFuture) {
    		System.out.println(future.get());
		  }
    }

所以如果需要返回值,则:
1、提供方:在对应的@Async中返回值只能是AsyncResult<"返回的数据的类型">("返回的数据")
2、调用方:先调用该@Async方法,之后再通过future.get()就可以得到相应的返回值

调用之后的结果如下:

pool-1-thread-2
pool-1-thread-1
pool-1-thread-3
pool-1-thread-4
pool-1-thread-5
testAsync-->out0
testAsync-->out1
testAsync-->out2
testAsync-->out3
testAsync-->out4

可以看到,@Async是异步执行的,但是得到结果是按顺序得到的。

2 回复

不好意思,打错字 了。应该是“继承”,而不是“继续”。

隐藏功能被你找的了,哈哈

添加回复
请先登陆
回到顶部