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

Java并發(fā)編程Callable與Future的應用實例代碼

 更新時間:2018年01月10日 15:57:12   作者:李秀才  
這篇文章主要介紹了Java并發(fā)編程Callable與Future的應用實例代碼,具有一定借鑒價值,需要的朋友可以參考下

本文主要探究的是java并發(fā)編程callable與future的使用,分享了相關實例代碼,具體介紹如下。

我們都知道實現(xiàn)多線程有2種方式,一種是繼承Thread,一種是實現(xiàn)Runnable,但這2種方式都有一個缺陷,在任務完成后無法獲取返回結果。要想獲得返回結果,就得使用Callable,Callable任務可以有返回值,但是沒法直接從Callable任務里獲取返回值;想要獲取Callabel任務的返回值,需要用到Future。所以Callable任務和Future模式,通常結合起來使用。

試想一個場景:需要一個帖子列表接口,除了需要返回帖子列表之外,還需要返回每條帖子的點贊列表和評論列表。一頁10條帖子來計算,這個接口需要訪問21次數(shù)據庫,訪問一次數(shù)據庫按100ms計算,21次,累計時間為2.1s。這個響應時間,怕是無法令人滿意的。怎么辦呢?異步化改造接口。

查出帖子列表后,迭代帖子列表,在循環(huán)里起10個線程,并發(fā)去獲取每條帖子的點贊列表,同時另起10個線程,并發(fā)去獲取每條帖子的評論列表。這樣改造之后,接口的響應時間大大縮短,在200ms。這個時候就要用Callabel結合Future來實現(xiàn)。

private List<PostResponse> createPostResponseList(Page<PostResponse> page,final String userId){ 
    if(page.getCount()==0||page==null||page.getList()==null){ 
      return null; 
    } 
    //獲取帖子列表 
    List<PostResponse> circleResponseList = page.getList(); 
    int size=circleResponseList.size(); 
    ExecutorService commentPool = Executors.newFixedThreadPool(size); 
    ExecutorService supportPool = Executors.newFixedThreadPool(size); 
    try { 
      List<Future> commentFutureList = new ArrayList<Future>(size); 
      if (circleResponseList != null && circleResponseList.size() > 0) { 
        for (PostResponse postResponse : circleResponseList) { 
          final String circleId=postResponse.getId(); 
          final String postUserId=postResponse.getUserId(); 
          //查評論列表 
          Callable<List<CircleReviews>> callableComment = new Callable<List<CircleReviews>>() { 
            @Override 
            public List<CircleReviews> call() throws Exception { 
              return circleReviewsBiz.getPostComments(circleId); 
            } 
          }; 
          Future f = commentPool.submit(callableComment); 
          commentFutureList.add(f); 
          //查點贊列表 
          Callable<List<CircleZan>> callableSupport = new Callable<List<CircleZan>>() { 
            @Override 
            public List<CircleZan> call() throws Exception { 
              return circleZanBiz.findList(circleId); 
            } 
          }; 
          Future supportFuture = supportPool.submit(callableSupport); 
          commentFutureList.add(supportFuture); 
        } 
 
      } 
      // 獲取所有并發(fā)任務的執(zhí)行結果 
      int i = 0; 
      PostResponse temp = null; 
      for (Future f : commentFutureList) { 
        temp = circleResponseList.get(i); 
        temp.setCommentList((List<CircleReviews>) f.get(); 
        temp.setSupportList((List<CircleZan>) f.get(); 
        circleResponseList.set(i, temp); 
        i++; 
      } 
 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } finally { 
      // 關閉線程池 
      commentPool.shutdown(); 
      supportPool.shutdown(); 
    } 
    return circleResponseList; 
} 

總結

以上就是本文關于Java并發(fā)編程Callable與Future的應用實例代碼的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • spring Roo安裝使用簡介

    spring Roo安裝使用簡介

    這篇文章主要介紹了spring Roo安裝使用簡介,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • JAVA實現(xiàn)賬戶取款和存款操作

    JAVA實現(xiàn)賬戶取款和存款操作

    這篇文章主要介紹了JAVA實現(xiàn)賬戶取款和存款操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • springboot快速整合Mybatis組件的方法(推薦)

    springboot快速整合Mybatis組件的方法(推薦)

    Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。這篇文章主要介紹了springboot快速整合Mybatis組件的方法,需要的朋友可以參考下
    2019-11-11
  • 圖文詳解Java中的序列化機制

    圖文詳解Java中的序列化機制

    java中的序列化可能大家像我一樣都停留在實現(xiàn)Serializable接口上,對于它里面的一些核心機制沒有深入了解過。本文將通過示例帶大家深入了解Java中的序列化機制,需要的可以參考一下
    2022-10-10
  • Java注解處理器學習之編譯時處理的注解詳析

    Java注解處理器學習之編譯時處理的注解詳析

    編譯時注解相信對每一個java開發(fā)者來說都不陌生,下面這篇文章主要給大家介紹了關于Java注解處理器學習之編譯時處理的注解的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-05-05
  • 利用java實現(xiàn)中獎概率詳情

    利用java實現(xiàn)中獎概率詳情

    這篇文章主要介紹了利用java實現(xiàn)中獎概率詳情,根據概率將獎品劃分區(qū)間,每個區(qū)間代表一個獎品,然后抽取???隨機數(shù)??,反查落在那個區(qū)間上,即為所抽取的獎品,需要的朋友可以參考一下
    2022-07-07
  • SpringBoot使用MyBatis時的幾種傳參規(guī)范示例

    SpringBoot使用MyBatis時的幾種傳參規(guī)范示例

    使用Mybatis作為持久層框架時,對于數(shù)據庫的增刪改查等操作都需要參數(shù)的傳遞,本文就詳細的介紹了一下SpringBoot使用MyBatis時的幾種傳參規(guī)范示例,感興趣的可以了解一下
    2022-02-02
  • Java中的Future獲取任務返回值詳解

    Java中的Future獲取任務返回值詳解

    這篇文章主要介紹了Java中的Future獲取任務返回值詳解,在向線程池ThreadPoolExecutor提交任務時,一般為了方便操作采用execute提交任務,這時線程其實是無返回值的,需要的朋友可以參考下
    2023-12-12
  • SpringWebMVC的常用注解及應用分層架構詳解

    SpringWebMVC的常用注解及應用分層架構詳解

    這篇文章主要介紹了SpringWebMVC的常用注解及應用分層架構,SpringWebMVC是基于ServletAPI構建的原始Web框架,從?開始就包含在Spring框架中,感興趣的朋友可以參考下
    2024-05-05
  • java評論、回復功能設計與實現(xiàn)方法

    java評論、回復功能設計與實現(xiàn)方法

    很多項目或者系統(tǒng)都有評論或者回復的需求,但評論回復的實現(xiàn)往往都比較復雜,也不好實現(xiàn),下面這篇文章主要給大家介紹了關于java評論、回復功能設計與實現(xiàn)的相關資料,需要的朋友可以參考下
    2022-06-06

最新評論

怀来县| 木兰县| 广安市| 昂仁县| 三江| 兴隆县| 稻城县| 乐都县| 万州区| 黑龙江省| 巴彦淖尔市| 渝中区| 凤台县| 徐州市| 黄浦区| 启东市| 泸西县| 积石山| 威海市| 武安市| 长岭县| 遂平县| 乳山市| 永吉县| 岐山县| 龙陵县| 马鞍山市| 普兰县| 长岛县| 若羌县| 南通市| 洛扎县| 邯郸县| 铜陵市| 斗六市| 唐海县| 平武县| 寿阳县| 集安市| 洪洞县| 左云县|