您通常不想在ApplicationServer中创建自己的线程,也不想管理线程生命周期。在应用程序服务器中,您可以将任务提交给
ExecutorService
以汇集后台工作线程。
方便的是,Spring具有
@Async
为您处理所有这些的注释。在您的示例中,您将创建两个返回Future的异步方法:
public class PetService {
public Object getData() {
Future<Integer> futureFirstResult = runFirstQuery();
Future<Integer> futureSecondResult = runSecondQuery();
Integer firstResult = futureFirstResult.get();
Integer secondResult = futureSecondResult.get();
}
@Async
public Future<Integer> runFirstQuery() {
//do query
return new AsyncResult<>(result);
}
@Async
public Future<Integer> runSecondQuery() {
//do query
return new AsyncResult<>(result);
}
}
只要您配置
ThreadPoolTaskExecutor
并启用异步方法,Spring将为您处理提交任务。
注:
get()
方法阻塞当前线程,直到工作线程返回结果,但不阻塞其他工作线程。通常建议设置一个超时以防止永远阻塞。