回覆列表
  • 1 # 使用者7636101792795

    Excel檔案中的記錄比較多的話,要考慮使用多執行緒。可以考慮使用多執行緒設計模式中的Producer-Consumer模式。首先,專門開闢一個執行緒(一個夠用,多了無益,以下稱之為Reader執行緒),該執行緒負責讀取Excel檔案中的記錄。比如使用第三方工具POI,此時讀取到的Excel記錄是一個Java物件。該執行緒每次讀取到記錄都將其存入佇列(如ArrayBlockingQueue)。它僅負責讀取記錄並將其存入佇列,其它的事情它不做。其次,再設定若干個執行緒(如果一個夠用,就一個。數量最好不要超過系統的CPU個數,以下稱為Processor執行緒),這些執行緒負責從上述佇列中取出記錄(物件),然後對記錄中的資料進行校驗,寫入資料庫(這裡我假設匯入的目標是資料庫,你的問題中並沒有說明匯入目標是什麼)。最後,Reader執行緒讀取完所以記錄之後,要“通知”Processor執行緒:等你處理完所有記錄後,你可以停止了。這點,可以藉助多執行緒設計模式中的Two-phase Termination模式來實現。其主要思想是為要停止的執行緒(目標執行緒,這裡就是Processor執行緒)設定一個停止標誌,並設定一個表示目標執行緒的工作任務數(這裡值有多少條記錄需要它處理)的變數。當目標執行緒偵測到其待處理的任務數為0,且執行緒停止標誌已置為true的情況下,該執行緒就可以停止了。Two-phase Termination模式參考這裡:Java多執行緒程式設計模式實戰指南(三):Two-phase Termination模式。更詳細的,可以參考我的新書。最後,相應注意“產品”的粒度。即Reader執行緒往佇列(傳輸通道)中存入的“產品”是個什麼物件,是一條Excel記錄,還是多條Excel記錄?一般為了減少“產品”在佇列中的移動次數(以減少相應開銷)要適當將“產品”的粒度設定粗一些。例如,建立一個“容器型”物件用來儲存多條記錄。

  • 中秋節和大豐收的關聯?
  • 豆角丁炒肉?