近期在协会博客园中,有人发布了博客,系统进行查重的时候由于机器最低配置进行大量计算时需要十秒左右时间才能处理完,由于一开始是单例模式,导致,在某人查重的时候整个系统是不会再响应别的请求的,导致了系统假死状态,那么我们就应该使用多线程进行处理,将这种不能快速返回结果的方法交给线程池进行处理。
而我们自己使用Java Thread实现多线程又比较麻烦,在这里我们使用SpringBoot自带的多线程支持,仅需两步就可以对我们的查重方法利用多线程进行处理
第一步:编写配置类
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;
@Configuration
@EnableAsync // 启用异步任务
public class AsyncConfig {
// 声明一个线程池(并指定线程池的名字)
@Bean("AsyncThread")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数5:线程池创建时候初始化的线程数
executor.setCorePoolSize(5);
//最大线程数5:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
executor.setMaxPoolSize(10);
//缓冲队列500:用来缓冲执行任务的队列
executor.setQueueCapacity(500);
//允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
executor.setKeepAliveSeconds(60);
//线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
executor.setThreadNamePrefix("AsyncThread-");
executor.initialize();
return executor;
}
}
第二步:对方法使用注解标注为使用多线程进行处理,并将方法改写返回类型(因为不能立即返回,所以需要将返回值改为CompletableFuture<String>,
返回的时候使用return CompletableFuture.completedFuture(str);)
方法示范:
@Async("AsyncThread")
@RequestMapping(value = "/addBlog")
public CompletableFuture<String> addBlog(HttpSession httpSession, Blog blog, String blogId, boolean tempSave) {
System.out.println("\n\n----------------------------------------------");
System.out.println(Thread.currentThread().getName() + "正在处理请求");
System.out.println("----------------------------------------------");
String result = "请求失败";
//....你的业务逻辑
return CompletableFuture.completedFuture(result);
}
这样以后你的这个方法将会交由线程池去进行处理,并将结果返回,一定要记得改返回值类型,否则返回的将是空的。