日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

SpringBoot 并發編程學習歷程,你所需要的所有知識點!

來源: 責編: 時間:2023-09-28 10:07:53 285觀看
導讀本教程大概目錄:模擬單線程情節用Callable實現 并發編程用DeferedResult實現異步處理###模擬單線程情節。/** * Created by Fant.J. */@RestController@Slf4jpublic class AsyncController { /** * 單線程測試

Lxx28資訊網——每日最新資訊28at.com

本教程大概目錄:Lxx28資訊網——每日最新資訊28at.com

  • 模擬單線程情節
  • 用Callable實現 并發編程
  • 用DeferedResult實現異步處理

###模擬單線程情節。Lxx28資訊網——每日最新資訊28at.com

/** * Created by Fant.J. */@RestController@Slf4jpublic class AsyncController {    /**     * 單線程測試     * @return     * @throws InterruptedException     */    @RequestMapping("/order")    public String order() throws InterruptedException {        log.info("主線程開始");        Thread.sleep(1000);        log.info("主線程返回");        return "success";    }}

我們把線程休息一秒當作模擬處理業務所花費的時間。很明顯能看出來,這是個單線程。Lxx28資訊網——每日最新資訊28at.com

Lxx28資訊網——每日最新資訊28at.com

nio-8080-exec-1表示主線程的線程1。Lxx28資訊網——每日最新資訊28at.com

Lxx28資訊網——每日最新資訊28at.com

用Callable實現 并發編程

/**     * 用Callable實現異步     * @return     * @throws InterruptedException     */    @RequestMapping("/orderAsync")    public Callable orderAsync() throws InterruptedException {        log.info("主線程開始");        Callable result = new Callable() {            @Override            public Object call() throws Exception {                log.info("副線程開始");                Thread.sleep(1000);                log.info("副線程返回");                return "success";            }        };        log.info("主線程返回");        return result;    }

Lxx28資訊網——每日最新資訊28at.com

Lxx28資訊網——每日最新資訊28at.com

我們可以看到,主線程的開始和返回(結束處理)是首先執行的,然后副線程才執行真正的業務處理。說明主線程在這里的作用是調用(喚醒)子線程,子線程處理完會返回一個Object對象,然后返回給用戶。Lxx28資訊網——每日最新資訊28at.com

這樣雖然實現了并發處理,但是有一個問題,就是主線程和副線程沒有做到完全分離,畢竟是一個嵌套進去的副線程。Lxx28資訊網——每日最新資訊28at.com

所以為了優化我們的實現,我在這里模擬 消息中間件 來實現主線程副線程的完全分離。Lxx28資訊網——每日最新資訊28at.com

用DeferedResult實現異步處理

因為本章主要講的是并發編程原理,所以這里我們不用現成的消息隊列來搞,我們模擬一個消息隊列來處理。Lxx28資訊網——每日最新資訊28at.com

MockQueue .java

/** * 模擬消息隊列 類 * Created by Fant.J. */@Component@Slf4jpublic class MockQueue {    //下單消息    private String placeOrder;    //訂單完成消息    private String completeOrder;    public String getPlaceOrder() {        return placeOrder;    }    public void setPlaceOrder(String placeOrder) throws InterruptedException {        new Thread(()->{            log.info("接到下單請求"+placeOrder);            //模擬處理            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            //給completeOrder賦值            this.completeOrder = placeOrder;            log.info("下單請求處理完畢"+placeOrder);        }).start();    }    public String getCompleteOrder() {        return completeOrder;    }    public void setCompleteOrder(String completeOrder) {        this.completeOrder = completeOrder;    }}

注意再setPlaceOrder(String placeOrder)方法里,我創建了一個新的線程來處理接單的操作(為什么要建立新線程,怕主線程在這掛起,此段邏輯也沒有線程安全問題,況且異步處理更快)。傳進來的參數是個 訂單號 ,經過1s的處理成功后,把訂單號傳給completeOrder 字段,說明用戶下單成功,我在下面付controller調用該方法的代碼。Lxx28資訊網——每日最新資訊28at.com

//注入模擬消息隊列類    @Autowired    private MockQueue mockQueue;    @Autowired    private DeferredResultHolder deferredResultHolder;    ....    @RequestMapping("/orderMockQueue")    public DeferredResult orderQueue() throws InterruptedException {        log.info("主線程開始");        //隨機生成8位數        String orderNumber = RandomStringUtils.randomNumeric(8);        mockQueue.setPlaceOrder(orderNumber);        DeferredResult result = new DeferredResult();        deferredResultHolder.getMap().put(orderNumber,result);        Thread.sleep(1000);        log.info("主線程返回");        return result;    }

好了,然后我們還需要一個中介類來存放訂單號和處理結果。為什么需要這么一個類呢,因為我們之前說過要實現主線程和副線程分離,所以需要一個中介來存放處理信息(比如:這個訂單號信息,和處理結果信息),我們判斷處理結果是否為空就知道該副線程執行了沒有。所以我們寫一個中介類DeferredResultHolder 。Lxx28資訊網——每日最新資訊28at.com

######DeferredResultHolder .java:Lxx28資訊網——每日最新資訊28at.com

/** *  訂單處理情況 中介/持有者 * Created by Fant.J. */@Componentpublic class DeferredResultHolder {    /**     * String: 訂單號     * DeferredResult:處理結果     */    private Map<String,DeferredResult> map = new HashMap<>();    public Map<String, DeferredResult> getMap() {        return map;    }    public void setMap(Map<String, DeferredResult> map) {        this.map = map;    }}

在重復一次-.-,為什么需要這么一個類呢,因為我們之前說過要實現主線程和副線程分離,所以需要一個中介來存放處理信息(比如:這個訂單號信息,和處理結果信息),一個訂單肯定要對應一個結果。不然豈不是亂了套。Lxx28資訊網——每日最新資訊28at.com

DeferredResult是用來放處理結果的對象。Lxx28資訊網——每日最新資訊28at.com

好了,那新問題又來了,我們怎么去判斷訂單處理成功了沒有,我們此時就需要寫一個監聽器,過100毫秒監聽一次MockQueue類中的completeOrder中是否有值,如果有值,那么這個訂單就需要被處理。我們寫一個監聽器。Lxx28資訊網——每日最新資訊28at.com

######QueueListener .java:Lxx28資訊網——每日最新資訊28at.com

/** * Queue監聽器 * Created by Fant.J. */@Component@Slf4jpublic class QueueListener implements ApplicationListener<ContextRefreshedEvent>{    @Autowired    private MockQueue mockQueue;    @Autowired    private DeferredResultHolder deferredResultHolder;    @Override    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {        new Thread(()->{            while(true){                //判斷CompleteOrder字段是否是空                if (StringUtils.isNotBlank(mockQueue.getCompleteOrder())){                    String orderNumber = mockQueue.getCompleteOrder();                    deferredResultHolder.getMap().get(orderNumber).setResult("place order success");                    log.info("返回訂單處理結果");                    //將CompleteOrder設為空,表示處理成功                    mockQueue.setCompleteOrder(null);                }else {                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }).start();    }}

Lxx28資訊網——每日最新資訊28at.com

我們可以看到一共有三個不同的線程來處理。Lxx28資訊網——每日最新資訊28at.com

Lxx28資訊網——每日最新資訊28at.com

分割線后,我再給大家帶來一批干貨,自定義線程池https://www.jianshu.com/p/832f2b162450。Lxx28資訊網——每日最新資訊28at.com

學完這個后,再看下面的。Lxx28資訊網——每日最新資訊28at.com

我們前面的代碼中,有兩部分有用new Thread()來創建線程,我們有自己的線程池后,就可以用線程池來分配線程任務了,我在自定義線程里有講,我用的是第二種配置方法(用@Async注解來給線程 )。
修改如下:Lxx28資訊網——每日最新資訊28at.com

@Async    public void setPlaceOrder(String placeOrder) throws InterruptedException {            log.info("接到下單請求"+placeOrder);            //模擬處理            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            //給completeOrder賦值            this.completeOrder = placeOrder;            log.info("下單請求處理完畢"+placeOrder);    }

我們看看效果:Lxx28資訊網——每日最新資訊28at.com

Lxx28資訊網——每日最新資訊28at.com

圈紅圈的就是我們自己定義的線程池里分配的線程。Lxx28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-11844-0.htmlSpringBoot 并發編程學習歷程,你所需要的所有知識點!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Elasticsearch安裝與配置指南:快速搭建高性能搜索引擎!

下一篇: 如何使用Python中的OCR技術將圖像中的文本提取為可編輯文件?

標簽:
  • 熱門焦點
  • 自動化在DevOps中的力量:簡化軟件開發和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發生命周期中實現更
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 微軟邀請 Microsoft 365 商業用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 小紅書1周漲粉49W+,我總結了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人&ldquo;珍藏&rdquo;是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 電視息屏休眠仍有網絡上傳 愛奇藝被質疑“薅消費者羊毛”

    記者丨寧曉敏 見習生丨汗青出品丨鰲頭財經(theSankei) 前不久,愛奇藝發布了一份亮眼的一季報,不僅營收和會員營收創造歷史最佳表現,其運營利潤也連續6個月實現增長。自去年年初
  • 華為HarmonyOS 4升級計劃公布:首批34款機型今日開啟公測

    8月4日消息,今天下午華為正式發布了HarmonyOS 4系統,在更流暢的前提下,還帶來了不少新功能,UI設計也有變化,會讓手機煥然一新。華為宣布,首批機型將會在
  • 華為Mate60標準版細節曝光:經典星環相機模組回歸

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 主站蜘蛛池模板: 梅河口市| 祥云县| 柞水县| 逊克县| 砚山县| 沽源县| 东港市| 沾益县| 文山县| 汉源县| 阳春市| 多伦县| 富源县| 平顺县| 武穴市| 策勒县| 乌拉特前旗| 泗洪县| 海门市| 铜山县| 仪陇县| 靖西县| 青铜峡市| 绥棱县| 高阳县| 航空| 雷州市| 花莲县| 山丹县| 阳春市| 宁安市| 汉川市| 大连市| 永善县| 瑞安市| 新沂市| 咸丰县| 滨州市| 芦山县| 新郑市| 丹江口市|