线程异步处理任务

实际开发中,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("其他业务逻辑处理完成");
    }

打印如下:

 

都可以做到异步处理任务。

 

posted @ 2025-03-14 21:12  多多指教~  阅读(13)  评论(0)    收藏  举报