2016-02-12 41 views
0

我有一個場景,就像我想要讀取一個包含大約2000條記錄的電子表格並將其輸入到數據庫中。Java 8中的Fork-Join框架是最佳選擇嗎?

目前我們正在使用Executor框架。我們有限制,任務不應該只有5個。每個任務從Excel中讀取20行。我們提供從Excel中讀取的行到每個任務的開始索引和結束索引。

說,目前,
任務1處理1-20
任務-2處理21-40
任務-3處理41-60
任務-4處理61-80
任務-5-手柄81- 100

如果任務1完成其執行,則需要接下來的20行101-120。
假設如果任務2在任務1之前完成,它將開始從121-140而不是101-120讀取。

我可以在Fork-Join框架中更有效地處理這種情況,只限制5個任務和每個任務20行嗎?

需要深入瞭解性能問題。

+2

我看不出有任何理由改變框架。 – Holger

+0

現在,任務的處理現在是由我們設計的代碼完成的,即如果任務1結束,則分配下一個任務由自定義代碼完成。 fork-join框架是否有任何有效的方法來處理它本身?此外,我們插入延遲等待,直到完成所有任務以獲得結果。 fork-join框架本身是否處理這個問題? – dove4evr

回答

3

無需切換線程池。爲了使負載更加均衡你可以保持原子變量指向第一不採取行:

AtomicInteger currentRow = new AtomicInteger(); // shared between tasks 
final int maxRow = 2000; 
final int batchSize = 20; 

// Inside every task: 
while(true) { 
    int row = currentRow.getAndAdd(batchSize); 
    if(row >= maxRow) return; 
    int from = row+1; 
    int to = Math.min(row+batchSize, maxRow); 
    // process rows from..to; it's guaranteed that other threads 
    // do not process the same rows. 
} 

每個任務的主體是完全一樣的。這個實現也不依賴於創建的任務數量。如果您以後決定完成3個任務或7個任務,只需調整線程池大小並提交更多(或更少)的任務。

+0

目前,該框架用於從數據庫中讀取數據並寫入Google電子表格。問題在於,當我們編寫時,第一個任務從數據庫中獲取100行,根據自定義邏輯過濾數據並將結果行單獨寫入電子表格。因此,對於開始寫作的第二項任務,我們需要等到第一項任務完成後才知道第二項任務應該從哪一行開始寫入。因此我想知道,如果fork-join框架本身處理這種情況。工作竊取算法在Fork-join中如何工作? – dove4evr