天天看點

異步調用實作多線程處理任務 | 帶你讀《SpringBoot實戰教程》之十四

上一篇: 定義全局異常處理器 | 帶你讀《SpringBoot實戰教程》之十三 下一篇: 官方推薦!SpringBoot這樣整合JSP | 帶你讀《SpringBoot實戰教程》之十五 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程《SpringBoot實戰教程》,主講人楊紅豔, 點選檢視視訊内容

21.異步調用:

在項目中,當通路其它接口較慢或者做耗時任務時,不想程式一直卡在耗時任務上,想程式能夠并行執行,我們可以使用多線程來并行的處理任務,SpringBoot提供了異步處理方式@Async。

編寫AsyncService:

public interface AsyncService {

    Future<String> doTask1()throws Exception;
    Future<String> doTask2()throws Exception;
    Future<String> doTask3()throws Exception;
}           

編寫AsyncServiceImpl:

@Service
public class AsyncServiceImpl implements AsyncService {
    
    public static Random random =new Random();     

    @Async
    @Override
    public Future<String> doTask1() throws Exception {
            System.out.println("開始做任務一");  
            long start = System.currentTimeMillis();  
            Thread.sleep(random.nextInt(10000));  
            long end = System.currentTimeMillis();  
            System.out.println("完成任務一,耗時:" + (end - start) + "毫秒");  
            return new AsyncResult<>("任務一完成");  
    }

    @Async
    @Override
    public Future<String> doTask2()throws Exception {
        System.out.println("開始做任務二");  
        long start = System.currentTimeMillis();  
        Thread.sleep(random.nextInt(10000));  
        long end = System.currentTimeMillis();  
        System.out.println("完成任務二,耗時:" + (end - start) + "毫秒");  
        return new AsyncResult<>("任務二完成"); 
    }

    @Async
    @Override
    public Future<String> doTask3() throws Exception{
        System.out.println("開始做任務三");  
        long start = System.currentTimeMillis();  
        Thread.sleep(random.nextInt(10000));  
        long end = System.currentTimeMillis();  
        System.out.println("完成任務三,耗時:" + (end - start) + "毫秒");  
        return new AsyncResult<>("任務三完成"); 
    }

}           

在Controller中調用service功能:

@Controller
public class TestController {
    
    @Autowired
    private AsyncService asyncService;    
    
    @RequestMapping("/async")
    @ResponseBody
    public String getEntityById() throws Exception {  
        
        long start = System.currentTimeMillis();  
  
        Future<String> task1 = asyncService.doTask1();  
        Future<String> task2 = asyncService.doTask2();  
        Future<String> task3 = asyncService.doTask3();  
  
        while(true) {  
            if(task1.isDone() && task2.isDone() && task3.isDone()) {  
                // 三個任務都調用完成,退出循環等待  
                break;  
            }  
            Thread.sleep(1000);  
        }  
  
        long end = System.currentTimeMillis();  
  
        return "任務全部完成,總耗時:" + (end - start) + "毫秒";  
    }  

}           

要是使用異步的話,還需啟動類中開始異步執行。

在啟動類上加入@EnableAsync注解。

異步調用實作多線程處理任務 | 帶你讀《SpringBoot實戰教程》之十四

執行的結果為:

異步調用實作多線程處理任務 | 帶你讀《SpringBoot實戰教程》之十四
異步調用實作多線程處理任務 | 帶你讀《SpringBoot實戰教程》之十四