1背景
有時候會向excel文件中寫入數據,為了提高寫入速度,需要向每個sheet頁同時寫入數據;此時,可以采用多線程的方式同時進行寫入,提高效率。
2思路
既然需要用到多線程的,那么肯定需要創建多線程的工具、控制多線程的工具。在這里提供這樣一類工具:CountDownLatch類、ExecutorService類(這里只是一種方式,當然還有其他的方式)。
2.1CountDownLatch類
該類是用來同步多線程處理的類,只有等到每個線程運行完成后,它才會繼續后面的流程;打個這樣的比方:有十個人在十條跑道上比賽,每一個人占用一條跑道,在終點處有個計數員,他負責的任務是必須要等到10位運動員都跑到終點,他才可以宣布比賽結束,否則整個比賽還在繼續進行。這里的CountDownLatch對象就是相當於計數員的角色。它用到的三個方法是:
- 構造函數:new CountDownLatch(線程個數)。
- counDown():每個線程結束時都要調用該方法,計數器減一。
- await():在主線程中調用該方法,一直等到計數器減到為0為止,否則主線程一直暫定在這里。
2.2ExecutorService類
可以通過Autowire注解的方式生菜ExecutorService對象,然后通過submit方法來啟動一個線程,大致寫法如下:
@Autowire private ExecutorService executorService; public void test() { executorService.submit(()->{ // Todo 具體的邏輯實現 }) }
2.3StopWatch類
這個類是一個用來分析任務耗時的工具類,非常直觀、簡潔;使用起來也很簡單,大致如下:
StopWatch stopWatch = new StopWatch(Thread.currentThread().getStackTrace()[1].getMethodName()); stopWatch.start(“taskName”); // Todo 執行具體的任務 stopsWatch.stop();
數據分析示例:
----------------------------------------------
ns % Task name
3623048300 028% test2
114789400 010% test1
9120146000 071% test3
----------------------------------------------
- ns:時間單位,納秒
- %:任務耗時占比,值越大,耗時越長
- Task name:任務名稱
3小結
上文只是提到在遇到寫excel時需要同時寫入數據的實現思路,僅供參考。