AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

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

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

###模擬單線程情節。Knl28資訊網——每日最新資訊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";    }}

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

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

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

Knl28資訊網——每日最新資訊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;    }

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

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

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

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

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

用DeferedResult實現異步處理

因為本章主要講的是并發編程原理,所以這里我們不用現成的消息隊列來搞,我們模擬一個消息隊列來處理。Knl28資訊網——每日最新資訊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調用該方法的代碼。Knl28資訊網——每日最新資訊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 。Knl28資訊網——每日最新資訊28at.com

######DeferredResultHolder .java:Knl28資訊網——每日最新資訊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;    }}

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

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

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

######QueueListener .java:Knl28資訊網——每日最新資訊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();    }}

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

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

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

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

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 石頭智能洗地機A10 Plus體驗:雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機A10 Plus。從這個產品名上就不難看出,這次石頭推出的并不是常見的掃地機器
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現
  • 造車兩年股價跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個交易日起持有小米集團的股票,那么截至2023年上半年最后一個交易日,投資者將浮虧59.16%,同區間的恒生科技指數跌幅為52.78%
  • 8月見!小米MIX Fold 3獲得3C認證:支持67W快充

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 國行版三星Galaxy Z Fold5/Z Flip5發布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發布會,正式在國內推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀?! ∶绹鴷r間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內容審核等。此前,T
Top