线程异步处理任务
实际开发中,service层可能会执行多个步骤,那有些步骤可能和主任务没有太大关联,那我们可以采用线程去处理,这样就提高响应速度,当然也可以采用MQ,此处介绍的是用线程处理
1、controller层
@GetMapping("/thread")
public void thread(){
demo1Service.process();
}
2、serviceImpl层
① 此处直接用new Thread的方式
@Service
public class Demo1ServiceImpl {
public void process() { // 主线程逻辑 System.out.println("主线程开始执行"); // 启动子线程执行其他逻辑 Thread subThread = new Thread(() -> { System.out.println("子线程开始执行"); processOtherBusiness(); System.out.println("子线程执行结束"); }); subThread.start(); // 主线程继续执行 System.out.println("主线程继续执行其他逻辑"); }
private void processOtherBusiness() {
try {
Thread.sleep(3000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("其他业务逻辑处理完成");
}
}
② 此处采用的是ExecutorService线程池的方式
@Service public class Demo1ServiceImpl { private final ExecutorService executor = Executors.newFixedThreadPool(4); // 创建线程池
public void process() {
// 主线程逻辑
System.out.println("主线程开始执行");
// 提交任务到线程池
executor.submit(() -> {
System.out.println("子线程开始执行");
processOtherBusiness();
System.out.println("子线程执行结束");
});
// 主线程继续执行
System.out.println("主线程继续执行其他逻辑");
}
private void processOtherBusiness() {
try {
Thread.sleep(3000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("其他业务逻辑处理完成");
}
}
③ 此处采用的是threadPoolExecutor线程池技术
需要先将线程池注入到spring容器中
@Configuration public class ThreadPoolConfig { @Bean public ThreadPoolExecutor threadPoolExecutor() { // 创建线程池 return new ThreadPoolExecutor( 4, // 核心线程数 8, // 最大线程数 60, // 空闲线程存活时间 TimeUnit.SECONDS, // 时间单位 new LinkedBlockingQueue<>(100), // 任务队列 Executors.defaultThreadFactory(), // 线程工厂 new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 ); } }
@Service public class Demo1ServiceImpl { @Resource private ThreadPoolExecutor threadPoolExecutor; public void process() { // 主线程逻辑 System.out.println("主线程开始执行"); // 提交任务到线程池 threadPoolExecutor.submit(() -> { System.out.println("子线程开始执行"); processOtherBusiness(); System.out.println("子线程执行结束"); }); // 主线程继续执行 System.out.println("主线程继续执行其他逻辑"); } private void processOtherBusiness() { try { Thread.sleep(3000); // 模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("其他业务逻辑处理完成"); }
打印如下:

都可以做到异步处理任务。
浙公网安备 33010602011771号