最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot的異步任務(wù):無返回值和有返回值問題

 更新時間:2023年07月20日 09:33:49   作者:kailly235  
這篇文章主要介紹了springboot的異步任務(wù):無返回值和有返回值問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springboot異步任務(wù):無返回值和有返回值

在想要異步執(zhí)行的方法上加上@Async注解,在controller上加上@EnableAsync,即可。

注:這里的異步方法,只能在本類之外調(diào)用,在本類調(diào)用是無效的。

無返回值的異步任務(wù)

service實(shí)現(xiàn)部分:

@Service
public class AsyncService {
? ? @Async //想要異步執(zhí)行的方法上加@Async 注解
? ? public void doNoReturn(){
? ? ? ? try {
? ? ? ? ? ? // 這個方法執(zhí)行需要三秒
? ? ? ? ? ? Thread.sleep(3000);
? ? ? ? ? ? System.out.println("方法執(zhí)行結(jié)束" + new Date());
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? }
}

controller調(diào)用部分:

@RestController
@EnableAsync//調(diào)用異步任務(wù)的controller上加@EnableAsync注解
public class AsyncController {
? ? @Autowired
? ? private AsyncService asyncService;
? ? @RequestMapping(value = "/hello",method = RequestMethod.GET)
? ? public String testAsyncNoRetrun(){
? ? ? ? long start = System.currentTimeMillis();
? ? ? ? ?asyncService.doNoReturn();
? ? ? ? ?return String.format("任務(wù)執(zhí)行成功,耗時{%s}", System.currentTimeMillis() - start);
? ? }

輸出:

任務(wù)執(zhí)行成功,耗時{4}

可見testAsyncNoRetrun()方法中 調(diào)用doNoReturn(),沒等doNoReturn()執(zhí)行完即返回。

有返回值的異步任務(wù)

有返回值的異步任務(wù)方法需要用Futrue變量把返回值封裝起來。

service實(shí)現(xiàn)部分:

@Async
?public Future<String> doReturn(int i){
? ? ? ? try {
? ? ? ? ? ? // 這個方法需要調(diào)用500毫秒
? ? ? ? ? ? Thread.sleep(500);
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? // 消息匯總
? ? ? ? return new AsyncResult<>(String.format("這個是第{%s}個異步調(diào)用的證書", i));
}

讀取的時候要批量讀取不能單獨(dú)讀取。

controller調(diào)用部分:

@GetMapping("/hi")
? ? public Map<String, Object> testAsyncReturn() throws ExecutionException, InterruptedException {
? ? ? ? long start = System.currentTimeMillis();
? ? ? ? Map<String, Object> map = new HashMap<>();
? ? ? ? List<Future<String>> futures = new ArrayList<>();
? ? ? ? for (int i = 0; i < 10; i++) {
? ? ? ? ? ? Future<String> future = asyncService.doReturn(i);
? ? ? ? ? ? futures.add(future);
? ? ? ? }
? ? ? ? List<String> response = new ArrayList<>();
? ? ? ? for (Future future : futures) {
? ? ? ? ? ? String string = (String) future.get();
? ? ? ? ? ? response.add(string);
? ? ? ? }
? ? ? ? map.put("data", response);
? ? ? ? map.put("消耗時間", String.format("任務(wù)執(zhí)行成功,耗時{%s}毫秒", System.currentTimeMillis() - start));
? ? ? ? return map;
}

在瀏覽器輸入地址:http://localhost:8080/hi

結(jié)果如下: 耗時500多毫秒的意思代表,springboot自帶異步任務(wù)線程池是小于10的大小的

{"data":["這個是第{0}個異步調(diào)用的證書","這個是第{1}個異步調(diào)用的證書","這個是第{2}個異步調(diào)用的證書","這個是第{3}個異步調(diào)用的證書","這個是第{4}個異步調(diào)用的證書","這個是第{5}個異步調(diào)用的證書","這個是第{6}個異步調(diào)用的證書","這個是第{7}個異步調(diào)用的證書","這個是第{8}個異步調(diào)用的證書","這個是第{9}個異步調(diào)用的證書"],"消耗時間":"任務(wù)執(zhí)行成功,耗時{508}毫秒"}

springboot的異步任務(wù)(帶返回值和不帶返回值的處理)

注意:在用異步任務(wù)之前先給啟動類加@EnableAsync這個注解

新建異步任務(wù)包和在包里面建異步任務(wù)類

As.java異步類

package com.example.demo.async;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import java.util.concurrent.Future;
//注意:1、要把異步任務(wù)寫進(jìn)一個類里面而不能直接寫在controller中
//      2、如果需要拿到結(jié)果,則需要在調(diào)用處判斷全部的task.isDone()來確定異步任務(wù)的完成
@Component
//異步類注解,表明整個類的方法都是異步方法,如果把這個注解加在某一個方法上而不是某一個類則表明僅僅是這個方法才是異步方法
@Async
public class As {
    //下面是3個異步任務(wù)(不帶返回值的)
    public void task1() throws InterruptedException {
        long begin=System.currentTimeMillis();
        Thread.sleep(3000l);
        long end=System.currentTimeMillis();
        System.out.println("任務(wù)1耗時"+(end-begin));
    }
    public void task2() throws InterruptedException {
        long begin=System.currentTimeMillis();
        Thread.sleep(2000l);
        long end=System.currentTimeMillis();
        System.out.println("任務(wù)2耗時"+(end-begin));
    }
    public void task3() throws InterruptedException {
        long begin=System.currentTimeMillis();
        Thread.sleep(1000l);
        long end=System.currentTimeMillis();
        System.out.println("任務(wù)3耗時"+(end-begin));
    }
    //下面是3個異步任務(wù)(帶返回值的,可以在調(diào)用出取地返回值)
    public Future<String> task4() throws InterruptedException {
        long begin=System.currentTimeMillis();
        Thread.sleep(3000l);
        long end=System.currentTimeMillis();
        return new AsyncResult<String>("任務(wù)4耗時"+(end-begin));
    }
    public Future<String> task5() throws InterruptedException {
        long begin=System.currentTimeMillis();
        Thread.sleep(2000l);
        long end=System.currentTimeMillis();
        return new AsyncResult<String>("任務(wù)5耗時"+(end-begin));
    }
    public Future<String> task6() throws InterruptedException {
        long begin=System.currentTimeMillis();
        Thread.sleep(1000l);
        long end=System.currentTimeMillis();
        return new AsyncResult<String>("任務(wù)6耗時"+(end-begin));
    }
}

controller測試控制器

package com.example.demo.controller;
import com.example.demo.async.As;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@RestController
public class He {
	//注入異步類
    @Autowired
    private As as;
    //測試異步任務(wù)沒帶返回值的,直接主線程瞬間就通過了
    @RequestMapping("/as")
    public Object as() throws InterruptedException {
        long begin=System.currentTimeMillis();
        as.task1();
        as.task2();
        as.task3();
        long end=System.currentTimeMillis();
        return "總耗時+"+(end-begin);
    }
    //測試異步任務(wù)帶返回值的,總耗時是最慢的那個任務(wù)的耗時
    @RequestMapping("/asHava")
    public Object ash() throws InterruptedException, ExecutionException {
        long begin=System.currentTimeMillis();
        Future<String> task4=as.task4();
        Future<String> task5=as.task5();
        Future<String> task6=as.task6();
        //先小堵塞主線程一會,用以拿到異步任務(wù)返回值
        while (!(task4.isDone()&&task5.isDone()&&task6.isDone())){
        }
        long end=System.currentTimeMillis();
        //取得異步任務(wù)的返回值并查看總耗時
        return "總耗時+"+(end-begin)+"   task4結(jié)果:"+task4.get()+"  task5結(jié)果:"+task5.get()+"  task6結(jié)果:"+task6.get();
        //結(jié)果是3s左右,因?yàn)檫M(jìn)入接口,三個異步任務(wù)瞬間開啟,再瞬間到while這兒堵起
        //由于三個異步任務(wù)幾乎是同時開啟的,所以等最慢的那個異步任務(wù)完成以后,肯定所有的異步任務(wù)都完成了
        //所以while這時才都為true,那么放開while,所以結(jié)果就是最慢的那個異步任務(wù)的時間
        //如果說不用這種異步取值而用同步的話,那么時間就是1+2+3就是6s左右,而不是最慢的那個任務(wù)的時間
    }
}

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java EasyExcel面向Excel文檔讀寫邏輯示例詳解

    java EasyExcel面向Excel文檔讀寫邏輯示例詳解

    這篇文章主要為大家介紹了java EasyExcel面向Excel文檔讀寫邏輯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java8如何從一個Stream中過濾null值

    Java8如何從一個Stream中過濾null值

    這篇文章主要介紹了Java8如何從一個Stream中過濾null值,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • IDEA中print("")輸出中文亂碼的解決方式

    IDEA中print("")輸出中文亂碼的解決方式

    文章描述了在Java中使用System.out.print輸出中文時出現(xiàn)亂碼的問題,并提供了解決方案:修改項(xiàng)目的編碼設(shè)置從GBK到UTF-8
    2025-10-10
  • Mybatis中Collection集合標(biāo)簽的使用詳解

    Mybatis中Collection集合標(biāo)簽的使用詳解

    這篇文章主要介紹了Mybatis中Collection集合標(biāo)簽的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java中Jackson快速入門

    Java中Jackson快速入門

    這篇文章主要介紹了Java中Jackson快速入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 快速解決springboot在yml配置了啟動端口但啟動還是8080問題

    快速解決springboot在yml配置了啟動端口但啟動還是8080問題

    這篇文章主要介紹了快速解決springboot在yml配置了啟動端口但啟動還是8080問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java使用jaxb操作xml示例

    java使用jaxb操作xml示例

    JAXB主要用來實(shí)現(xiàn)對象和XML之間的序列化和反序列化,關(guān)于JAXB的介紹就不多說了,這里主要總結(jié)下基本使用方法和一些注意事項(xiàng)
    2014-04-04
  • java顯示目錄文件列表和刪除目錄功能

    java顯示目錄文件列表和刪除目錄功能

    這篇文章主要介紹了java顯示目錄文件列表和刪除目錄功能,文章通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-12-12
  • ShardingSphere數(shù)據(jù)分片算法及測試實(shí)戰(zhàn)

    ShardingSphere數(shù)據(jù)分片算法及測試實(shí)戰(zhàn)

    這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)分片算法及測試實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • springboot 打包部署 共享依賴包(分布式開發(fā)集中式部署微服務(wù))

    springboot 打包部署 共享依賴包(分布式開發(fā)集中式部署微服務(wù))

    這篇文章主要介紹了springboot 打包部署 共享依賴包(分布式開發(fā)集中式部署微服務(wù))的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-06-06

最新評論

瑞昌市| 湘阴县| 延庆县| 阿图什市| 城步| 奉节县| 二连浩特市| 苏尼特右旗| 屯留县| 延安市| 偃师市| 琼结县| 依安县| 东兰县| 塔城市| 沁水县| 泾源县| 吉安市| 岑溪市| 印江| 法库县| 渝中区| 科技| 远安县| 巫溪县| 大理市| 景泰县| 辉南县| 抚顺县| 五河县| 象山县| 鹰潭市| 光山县| 沁阳市| 沂南县| 滁州市| 平顶山市| 璧山县| 东阿县| 安庆市| 香河县|