实际开发中,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线程池技术
@Service public class Demo1ServiceImpl {@Resourceprivate 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("其他业务逻辑处理完成");}
打印如下:
都可以做到异步处理任务。