首先完成一个线程池类
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();
}
}
本文详细介绍了在Spring框架中配置线程池并实现异步任务处理的方法。通过创建自定义的ExecutorConfig类,设置核心线程数、最大线程数、队列大小等参数,以及配置线程池中的线程名称前缀和拒绝策略。同时,展示了如何在HttpUtil类中使用@Async注解来执行异步方法,并通过Future接口的isDone()方法判断异步任务是否完成。
1756

被折叠的 条评论
为什么被折叠?



