首先完成一个线程池类 package cn.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; @Configuration @EnableAsync public class ExecutorConfig { private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class); @Bean public Executor asyncServiceExecutor() { logger.info("start asyncServiceExecutor"); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor(); //配置核心线程数 executor.setCorePoolSize(10); //配置最大线程数 executor.setMaxPoolSize(10); //配置队列大小 executor.setQueueCapacity(99999); //配置线程池中的线程的名称前缀 executor.setThreadNamePrefix("async-service-"); // rejection-policy:当pool已经达到max size的时候,如何处理新任务 // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //执行初始化 executor.initialize(); return executor; } 第二步:HttpUtil.java中的部分相关代码
@Async("asyncServiceExecutor") public Future<String> test(String name){ try { Thread.sleep(5000); System.out.println("test-->"+name); return new AsyncResult<>("name: " + name); }catch (Exception e){ return new AsyncResult<>("异常"); } } @Async("asyncServiceExecutor") public Future<String> test2(String name){ try { Thread.sleep(3000); System.out.println("test2-->"+name); return new AsyncResult<>("name: " + name); }catch (Exception e){ return new AsyncResult<>("异常"); } }
第三步:
@Autowired HttpUtil httpUtil;
...
public String test(String account) { // logger.info("test param--->account=" + account); String test1 = null; String test2=null; JSONObject json = new JSONObject(); try { System.out.println(new Date().getTime()); Future<String> result = httpUtil.test("test"); Future<String> result2 = httpUtil.test2("test2"); while(true) {//死循环,每隔1000ms执行一次,判断一下这2个异步调用的方法是否全都执行完了。 if (result.isDone() && result2.isDone()) {//使用Future的isDone()方法返回该方法是否执行完成 //如果异步方法全部执行完,跳出循环 break; } Thread.sleep(2000);//每隔1000毫秒判断一次 } json.put("test",result.get()); json.put("test2",result2.get()); System.out.println(new Date().getTime()); }catch (Exception ex){ } json.put("code", 1); return json.toJSONString(); }
}