线程池 ThreadPoolTaskExecutor
spring内置了ThreadPoolTaskExecutor线程池,可以直接初始化后声明为bean,在上下文的任意位置进行依赖注入。
线程实例的方法 execute/submit
如果你的线程不需要返回值,可以调用ThreadPoolTaskExecutor bean实例的execute方法,
如果需要返回值,可以调用submit方法。
示例
假设ThreadPoolTaskExecutor 的bean名称为 pool,则一个简单的线程执行实例为:
Future future=pool.submit(()=>doMyJob() );
有了lamda表达式,就是这么简单,其实lamda表达式中是创建了一个 Callable接口的匿名内部类。并且执行了在线程外面声明的doMyJob()方法。就是这么简单…
//异步方式查询
try {
Future<Map<String, Object>> bInfoFuture = threadPoolTaskExecutor.submit(() -> getCaseInfoByCaseids(caseids));
Future<Map<String, Object>> bInfothFuture = threadPoolTaskExecutor.submit(() -> getCaseInfothByCaseids(caseids));
Future<Map<String, Object>> bInspectionFuture = threadPoolTaskExecutor.submit(() -> getCaseInspectionByCaseids(caseids));
Future<Map<String, Object>> bCheckFuture = threadPoolTaskExecutor.submit(() -> getCaseCheckByCaseids(caseids));
Future<Map<String, Object>> bWpFuture = threadPoolTaskExecutor.submit(() -> getCaseWpByCaseids(caseids));
Future<Map<String, Object>> bAttachFuture =null;
if (mode == null || mode.indexOf("attach") < 0) {
bAttachFuture = threadPoolTaskExecutor.submit(() -> getCaseAttachByCaseids(caseids));
}
bInfo = bInfoFuture.get();
bInfoth=bInfothFuture.get();
bInspection=bInspectionFuture.get();
bCheck=bCheckFuture.get();
bWp=bWpFuture.get();
if (mode == null || mode.indexOf("attach") < 0) {
if(bAttachFuture!=null){
bAttach=bAttachFuture.get();
}
}
}catch(InterruptedException e){
throw e;
}catch (ExecutionException e){
throw e;
}
获取异步返回结果
当然,使用了submit方法,也就意味着需要得到线程的返回结果,上面返回的future对象中即可取得结果。
调用future.get()方法会阻塞当前线程,直到相应线程执行完毕返回类型为T的结果。达到同步效果。