日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用多线程实现报表的高效导出

發布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用多线程实现报表的高效导出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多線程、線程池、并發包每當談起這些詞匯,可能不是在面試就是在準備面試的路上了。

有句話叫“面試造航母,工作擰螺絲“,確實很多情況下我們是用不到這些東西的,但是學好這些東西對我們的日常工作也可能會產生意想不到的好處的。

臨近年末,收拾了下手頭工作,趁著最后兩天有些閑暇,準備著手優化下前段時間業務人員反饋的部分報表導出速度過慢的問題。

報表的優化主要是涉及兩個方面,一個是SQL和數據庫層面的優化,另一個就是代碼層面的優化了,本文主要講述代碼層面利用多線程處理的一點小總結。

多線程實現的基礎知識

實現多線程的方式

  • 繼承Thread類創建線程
  • 實現Runnable接口創建線程
  • 實現Callable接口創建線程
  • 線程池的實現

JDK自帶的五種線程池的使用場景

  • newSingleThreadExecutor:一個單線程的線程池,可以用于需要保證順序執行的場景,并且只有一個線程在執行。

  • newFixedThreadPool:一個固定大小的線程池,可以用于已知并發壓力的情況下,對線程數做限制。

  • newCachedThreadPool:一個可以無限擴大的線程池,比較適合處理執行時間比較小的任務。

  • newScheduledThreadPool:可以延時啟動,定時啟動的線程池,適用于需要多個后臺線程執行周期任務的場景。

  • newWorkStealingPool:一個擁有多個任務隊列的線程池,可以減少連接數,創建當前可用cpu數量的線程來并行執行。

?如何自定義線程池

在實際的使用過程中,一般我們都是用Executors去創建線程池,如果有一些其他的需求,比如指定線程池的拒絕策略,阻塞隊列的類型,線程名稱的前綴等等,我們可以采用自定義線程池的方式來解決。

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) ;
  • corePoolSize:線程池大小,決定著新提交的任務是新開線程去執行還是放到任務隊列中,也是線程池的最最核心的參數。一般線程池開始時是沒有線程的,只有當任務來了并且線程數量小于corePoolSize才會創建線程。

  • maximumPoolSize:最大線程數,線程池能創建的最大線程數量。

  • keepAliveTime:在線程數量超過corePoolSize后,多余空閑線程的最大存活時間。

  • unit:時間單位

  • workQueue:存放來不及處理的任務的隊列,是一個BlockingQueue。

  • threadFactory:生產線程的工廠類,可以定義線程名,優先級等。

  • handler:拒絕策略,當任務來不及處理的時候,如何處理, 前面有講解。

execute和submit的區別

  • execute適用于不需要關注返回值的場景,只需要將線程丟到線程池中去執行就可以了
  • submit方法適用于需要關注返回值的場景,在線程執行結束會返回響應的結果值

其實這兩種方法的底層就是Runnable,Callable的實現。

多線程的一些基礎小知識,有興趣的同學可以園子里翻翻其他同學的介紹,多線程、線程池、并發包這些東西無論是學習還是面試都是比較重要的。

報表優化案例

報表導出慢的原因探查

仔細檢查了需要優化的報表,發現因為這個報表的實時性要求比較高,同時涉及大量數據的計算操作,在優化了sql后效率還是無法達到滿意的程度,所以決定采用多線程的方式多個線程同時處理不同的業務邏輯,最后在合并數據返回,以達到提高效率的目的。

代碼解決方案

初步決定采用ExecutorService的submit方法,將一個復雜報表拆分為四個子線程執行并返回結果。同時采用并發包中的CountDownLatch做同步器,等待 四個子線程執行完畢后,再在主線程進行數據合并操作。假如每個子線程的執行時長在10分鐘左右,如果采用原先的串行方式的話,四個業務處理大概需要40分鐘左右,現在這種并行的方式執行只需要十分鐘的處理時間。

偽代碼實現

long startTime = DateUtils.getCurrentDateTime().getTime();ExecutorService service = Executors.newFixedThreadPool(4);CountDownLatch latch = new CountDownLatch(4);Future<List<CapitalVO>> borrowIncrement = service.submit(new Callable<List<CapitalVO>>() {@Overridepublic List<CapitalVO> call() throws Exception {List<CapitalVO> list = listBorrowIncrement(startDate, endDate);latch.countDown();return list;}});Future<List<OwnVO>> beceiveAccount = service.submit(new Callable<List<OwnVO>>() {@Overridepublic List<OwnVO> call() throws Exception {List<OwnVO> list = listReceiveAccount(startDate, endDate);latch.countDown();return list;}});Future<List<OwnVO>> buaranteeAccount = service.submit(new Callable<List<OwnVO>>() {@Overridepublic List<OwnVO> call() throws Exception {List<OwnVO> list = listGuaranteeAccount(startDate, endDate);latch.countDown();return list;}});Future<List<BorrowerVO>> borrowerRepayment = service.submit(new Callable<List<BorrowerVO>>() {@Overridepublic List<BorrowerVO> call() throws Exception {List<BorrowerVO> list = listBorrowerRepayment(startDate, endDate);latch.countDown();return list;}});latch.await();List<CapitalVO> borrowCapitalIncrement = borrowIncrement.get();List<OwnVO> ownReceive = beceiveAccount.get();List<OwnVO> ownAccountGuan = buaranteeAccount.get();List<BorrowerVO> borrower = borrowerRepayment.get();

上述代碼利用CountDownLatch實現了線程同步,同時解決了原本串行執行時間較長的問題,在最終的效果上也是達到了預期的優化目標,比原報表的處理時長減少了四分之三的時間。

另外,有同學提出現在是實現了四個線程并行處理,處理時長大概在十分鐘左右。但是假如其中一個線程出現了報錯,不在需要其他線程繼續執行,這個時候該怎么處理呢?

確實是存在這個情況的,其實我們可以利用Future對象的?cancel(boolean mayInterruptIfRunning)來中斷其他線程,底層其實還是thread.interrupt()的方法實現。

總結

總的來說技術方案上并沒有什么特別的東西,但是有時候有沒有往這方面做就是一個思考的問題了。其實在工作中九成以上的人每天都是在做CRUD的業務,但是即便是CRUD每個人做出來的東西還是有所不同的。多思考多實踐,其實多線程并沒有那么遙不可及,即便是簡單的報表,也是可以做出不一樣的東西的。

最后,新年臨近,祝福大家新年快樂,也希望自己能夠在新的一年做一個合格的creative worker。

轉載于:https://www.cnblogs.com/laoyeye/p/10340551.html

總結

以上是生活随笔為你收集整理的利用多线程实现报表的高效导出的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产激情一区二区三区四区 | 亚洲第一自拍 | 午夜精品在线播放 | 日韩无| 欧美七区| 91口爆一区二区三区在线 | 操碰视频在线 | 成人免费毛片日本片视频 | 国产美女精品人人做人人爽 | 朴麦妮原版视频高清资源 | 精品成人在线观看 | 私密spa按摩按到高潮 | 欧美一级少妇 | 亚洲麻豆一区 | 97蜜桃网| 人人爽人人爽人人片 | 欧美日韩一区二区三区视频 | 中文字幕电影一区二区 | 91免费国产在线 | 精品久久亚洲 | 三级欧美韩日大片在线看 | 青草福利在线 | 韩国一级片在线观看 | 美女屁股无遮挡 | 国产一区二区三区视频播放 | 国产在线视频第一页 | 欧日韩在线 | 精品欧美久久久 | 一本一道无码中文字幕精品热 | 久久久久久亚洲中文字幕无码 | 日本免费不卡视频 | 色婷婷av一区二区三区之红樱桃 | 欧洲激情网 | 欧美日韩在线播放视频 | 最新欧美大片 | 91亚洲欧美激情 | 国产精品久久综合青草亚洲AV | 麻豆伦理片 | 亚洲一区二区免费电影 | 在线无 | 亚洲又粗又长 | 光明影院手机版在线观看免费 | 少妇影院在线观看 | 污站在线观看 | 色又色| 久久久久人妻一区 | 欧美日韩高清一区二区 | 成人黄色短视频在线观看 | 99精品久久99久久久久 | 亚洲国产精品视频 | 天堂中文在线8 | 毛片视频免费播放 | 亚洲国产一区二区三区 | 国产成人啪精品午夜在线观看 | 亚洲涩涩在线 | 国产91边播边对白在线 | av黄色网 | 人人草人人草 | 亚洲播播| 天天操天天干天天插 | 欧美黄色一级 | 亚洲午夜电影网 | 爱操影院 | 久久成人精品一区二区 | 伊人黄色片 | www.777奇米影视 | 四虎1515hh.com | 光棍福利视频 | 国产一级在线观看视频 | 一区二区成人精品 | 午夜伦理影院 | japanese在线观看 | 欧美日韩小说 | 日本久久免费 | 午夜伦理福利视频 | 日本在线观看一区二区 | 久久婷婷网 | 毛片网站视频 | 欧美一卡二卡三卡四卡 | 伊人22综合 | 久艹在线观看视频 | 久久98| 欧洲亚洲女同hd | 中文字av | 亚欧精品在线观看 | 国产一级片免费视频 | 爱情岛论坛永久入口 | 中文字幕在线观看第一页 | 欧美高清一区二区 | 国产三级精品三级在线观看 | 99精品在线观看 | 性一交一乱一色一免费无遮挡 | 中文av在线播放 | 懂色中文一区二区在线播放 | 国产精品无码人妻一区二区在线 | 亚洲综合成人网 | 超碰人人擦 | 日韩性色| 欧美激情一级精品国产 |