日韩性视频-久久久蜜桃-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

總結

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

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

主站蜘蛛池模板: 九九色| 污版视频在线观看 | 国产人妖在线 | 1024香蕉视频 | 无套白嫩进入乌克兰美女 | 成人欧美在线观看 | 亚洲国产一级 | 美女视频黄是免费 | 熟女少妇内射日韩亚洲 | 激情福利社| 91网站视频在线观看 | 韩日av在线播放 | 黄色刺激视频 | 亚洲成人a∨ | 91色多多| jizz内谢中国亚洲jizz | 一区二区视 | 国产尻逼视频 | 丝袜视频在线观看 | 亚洲精品久久久蜜桃网尤妮丝 | 玖玖色在线| 国产精品5 | 91日批 | xxxx69视频 | 成人午夜福利视频 | 欧美成人xxxx| 天天躁夜夜操 | 日韩大片免费观看视频播放 | 亚洲天堂网站 | 亚洲阿v天堂 | 男人的天堂avav | 精品无码久久久久久久 | 人妻体内射精一区二区三区 | 久久久久久久久久久久Av | 欧美aa| 黄色一级片在线看 | 久久91精品国产 | h视频国产 | 日韩电影在线观看一区 | 日本黄色生活片 | 久久资源在线 | 国产精品熟妇一区二区三区四区 | 日韩a√ | 热久久精品免费视频 | 亚洲男人精品 | 黄色一二三区 | 亚洲小说春色综合另类 | 欧美成人激情视频 | 欧美日韩午夜爽爽 | 色妞在线 | 欧美色图3p | 能在线观看的av | 欧美性猛交bbbbb精品 | 国产女主播自拍 | 国产精品.xx视频.xxtv | 久久资源总站 | 色综合久久久无码中文字幕波多 | 午夜激情网址 | 性色av一区二区三区 | 欧美日韩一级大片 | av播放网站| 老汉色av | 一区二区成人精品 | 久久免费少妇高潮99精品 | 一区二区麻豆 | 国产午夜精品无码一区二区 | 四虎4hu永久免费网站影院 | 疯狂做受xxxx国产 | 91精品久久久久久久久久入口 | 久久这里只有精品6 | 夜夜狠| 亚洲乱码国产乱码精品精大量 | www.com毛片 | 免费在线看黄视频 | 亚洲精品传媒 | 日韩女优在线播放 | 亚洲 在线 | 久草成人网 | 国产亚洲一区二区三区在线观看 | 久久男女 | 高潮毛片又色又爽免费 | 东方av在线免费观看 | 成人精品久久久午夜福利 | 99福利网 | 40到50岁中老年妇女毛片 | 亚洲精品大片www | 欧美黑人精品一区二区 | 国产精品美女在线观看 | 久久亚洲国产成人精品性色 | 精品二区在线 | 青春草视频在线免费观看 | 精品视频久久久久 | 99re视频在线| 琪琪色av | 国产又粗又大又硬 | www.777含羞草| 久久久久网站 | 午夜大片网 | 亚洲av无一区二区三区怡春院 |