国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

開發 后端
如果一個項目總用單線程來跑,難免會遇到一些性能問題,所以再開發中,我們應該盡量適量的使用多線程(在保證線程安全的情況下)。

本教程大概目錄:

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

###模擬單線程情節。

/**
 * Created by Fant.J.
 */
@RestController
@Slf4j
public class AsyncController {

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

我們把線程休息一秒當作模擬處理業務所花費的時間。很明顯能看出來,這是個單線程。

nio-8080-exec-1表示主線程的線程1。

用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;
    }

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

這樣雖然實現了并發處理,但是有一個問題,就是主線程和副線程沒有做到完全分離,畢竟是一個嵌套進去的副線程。

所以為了優化我們的實現,我在這里模擬 消息中間件 來實現主線程副線程的完全分離。

用DeferedResult實現異步處理

因為本章主要講的是并發編程原理,所以這里我們不用現成的消息隊列來搞,我們模擬一個消息隊列來處理。

MockQueue .java

/**
 * 模擬消息隊列 類
 * Created by Fant.J.
 */
@Component
@Slf4j
public 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調用該方法的代碼。

//注入模擬消息隊列類
    @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 。

######DeferredResultHolder .java:

/**
 *  訂單處理情況 中介/持有者
 * Created by Fant.J.
 */
@Component
public 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;
    }
}

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

DeferredResult是用來放處理結果的對象。

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

######QueueListener .java:

/**
 * Queue監聽器
 * Created by Fant.J.
 */
@Component
@Slf4j
public 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();
    }
}

我們可以看到一共有三個不同的線程來處理。

分割線后,我再給大家帶來一批干貨,自定義線程池https://www.jianshu.com/p/832f2b162450。

學完這個后,再看下面的。

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

@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);
    }

我們看看效果:

圈紅圈的就是我們自己定義的線程池里分配的線程。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-09-08 13:46:12

ArrayList數據存儲容器

2024-01-24 11:59:44

Django自定義字段Python

2024-11-04 09:22:54

2020-07-27 10:40:35

C++11語言代碼

2025-07-08 00:00:00

2020-09-16 10:50:16

C++14語言代碼

2020-10-22 12:30:33

MySQL

2023-03-02 11:52:00

自定義自動配置

2024-02-26 08:19:00

WebSpring容器

2023-12-15 08:07:37

響應式布局官網

2022-02-09 16:25:34

區塊鏈技術加密貨幣

2021-05-18 09:03:16

Gomapslice

2011-04-01 15:28:40

Zabbix配置安裝

2010-07-27 15:49:28

Flex

2010-06-17 16:42:04

UML

2019-11-25 21:46:12

數據湖云計算數據倉庫

2024-09-19 16:00:01

網絡編程網絡Python

2018-01-29 15:23:14

網絡知識點軟件測試

2021-04-29 10:01:30

JavaMathJava編程

2020-05-08 10:11:08

人工智能
點贊
收藏

51CTO技術棧公眾號

欧美变态tickling挠脚心| 激情伦成人综合小说| 国产欧美一区二区视频| 中文字幕在线观看第一页| aa视频在线播放| а√天堂中文在线资源8| 国产欧美一级| 蜜桃成人av| 亚洲少妇30p| 欧洲成人在线观看| 看黄色免费网站| 日韩免费高清| 色综合天天综合色综合av| 91久久在线播放| h网站在线免费观看| 亚洲图片在线| 欧美精品一区二区三区在线 | 夜夜爽www精品| 欧美13videosex性极品| 国产在线播精品第三| 日韩中文在线视频| 99热在线观看免费| 五月天久久网站| 亚洲欧洲www| 成人免费网站在线观看| 婷婷激情在线| 韩国女主播成人在线观看| 在线精品国产欧美| 亚洲黄色小视频在线观看| 欧美国产偷国产精品三区| 欧美日韩精品高清| 亚洲一区二区精品在线| 99综合在线| 在线视频日本亚洲性| 性生活免费在线观看| 91精品一区二区三区综合| 国产精品第七影院| 黄色网页在线免费看| 国产成人亚洲综合色影视| 欧美精品在线视频观看| 成年女人18级毛片毛片免费| 成人一区而且| 亚洲天堂av综合网| 91福利免费在线| 日韩视频中文| 欧洲一区二区日韩在线视频观看免费 | 亚洲精品久久7777| 精品综合在线| 国产成人77亚洲精品www| 午夜精品久久一牛影视| 一区中文字幕在线观看| 欧美日韩一区二区三区视频播放| 日韩精品一区二区在线观看| 国产视频1区2区3区| 亚洲精品成人少妇| 日本在线天堂| 色久欧美在线视频观看| 丁香婷婷在线观看| 国产91精品一区二区麻豆亚洲| 国产精品视频久久久| 中文字幕资源网在线观看免费 | 国产日本欧美在线| 国产欧美精品国产国产专区| 久久久水蜜桃| 成人免费视频app| 国产一区二区三区四区五区在线| 久久精品99国产精品| 国产精品免费一区豆花| 国产精品va| 欧美大片免费播放| 国产精品大片免费观看| 中文字幕一区二区中文字幕| 影音先锋久久久| 日韩女在线观看| 欧美成人黑人| 91精品黄色片免费大全| 黄网址在线播放免费| 国产美女av一区二区三区| 国产在线一区二区三区四区| 国产一区999| igao视频网在线视频| 2023国产精品自拍| 亚洲欧美日韩精品在线| 欧美在线三级| 国产999在线| 日韩电影在线一区| 蜜桃传媒视频麻豆第一区免费观看 | 国产在线久久久| 国产精品115| 深夜成人在线观看| 四虎成人精品永久免费av九九| 免费看av软件| 色八戒一区二区三区| 一二三四中文在线| 国产亚洲一区二区三区在线观看| 国产精品日韩三级| 国产精品91一区二区| 国产在线日本| 欧美视频一区二区三区…| 中文字幕第12页| 亚洲精品中文字幕女同| 手机看片福利在线观看| 亚洲国产日韩一级| 最新91在线| 日韩视频亚洲视频| 天堂蜜桃91精品| 亚洲制服欧美久久| 精品国产91久久久| 亚州av中文字幕在线免费观看| 最近日韩中文字幕中文| 久久精品网址| 天堂社区 天堂综合网 天堂资源最新版 | 亚洲人成无码网站久久99热国产 | 欧美男gay| 九九热在线免费| 久久免费午夜影院| 黑人精品视频| 亚洲精品白浆高清久久久久久| 免费高清在线观看| 日韩欧美二区三区| 99精品视频在线观看播放| 无码少妇一区二区三区芒果| 亚洲欧美经典视频| 在线播放你懂的| 在线观看视频欧美| 2021国产在线| 亚洲图片在区色| 麻豆精品在线| 2019中文字幕全在线观看| 日韩成人精品一区二区| mm1313亚洲国产精品无码试看| 亚洲女人天堂色在线7777| 天堂成人免费av电影一区| 黄色免费在线看| 久久影视中文粉嫩av| 欧美日韩国产高清一区二区 | 日韩亚洲一区二区| 国产高清视频一区| 日韩一区二区三区在线免费观看 | 亚洲性生活视频| 国精产品一区一区三区mba桃花 | 91黄色小视频| 中文字幕日韩一区二区不卡 | 日本少妇精品亚洲第一区| 欧美在线观看网址综合| 欧美国产97人人爽人人喊| 亚洲私人影吧| 91免费在线视频网站| 在线一区二区三区四区五区| 国产日产高清欧美一区二区三区| 国内精品不卡| 国产精品av免费| 综合网中文字幕| 91毛片在线观看| 免费黄色在线视频网站| 日韩精品一区二区三区在线观看 | 色噜噜久久综合伊人一本| 99久久精品国产网站| 99re6热在线精品视频播放| 欧洲成人免费视频| 精品国产精品自拍| 国产精品多人| 精精国产xxxx视频在线野外 | 中文字幕无线精品亚洲乱码一区 | 国产精品视频免费一区二区三区 | 久久久久久久久一区二区| 精品剧情在线观看| 成人性生交大片| 东京久久高清| 欧美欧美欧美| 国产成年人在线观看| 久久69精品久久久久久久电影好 | 日韩一区二区三区在线| 亚洲精品成a人ⅴ香蕉片| 国产欧美亚洲精品| 欧美麻豆精品久久久久久| 999在线精品| 久久99导航| 在线国产精品播放| 亚洲综合一二区| 欧美黑人粗大| 男女羞羞视频教学| 亚洲欧美综合精品久久成人| 国产精品麻豆视频| 中文字幕在线中文字幕在线中三区 | 在线一区二区三区四区五区| 韩国午夜理伦三级不卡影院| 青青操综合网| 欧美一二三不卡| 337p亚洲精品色噜噜狠狠| 国产精品资源网站| 国产剧情在线观看一区| 成年女人18级毛片毛片免费| 日韩美女av在线免费观看| 日韩欧美国产精品一区| 久久精品亚洲国产奇米99| 国产精品蜜芽在线观看| 超清福利视频| 永久久久久久| 国产玖玖精品视频|