看到文档里面有说明@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是异步执行的,但是得到结果是按顺序得到的。