2009-09-10 41 views
1

這裏被簡化的我的要求的版本用獨立線程工作程序在Java中安排定期作業?

我有一個Java類說,包括方法的處理器說bigProcess()它是所有連接到文件服務器,下載指定的文件一旦被保存在文件中完成DB之後,更新一些不同表中的DB字段。

對於每個子任務,如下載文件,保存在數據庫中,在t1中更新字段等使用不同的方法。

處理器類每2小時調用一次,它必須處理每個調用約30到40個請求。爲了提高性能,我計劃爲每個請求(30到40個線程)跨越一個新的線程,每個線程調用bigProcess方法。

現在我的問題是我需要同步bigProcess()方法中的任何代碼塊(在這裏我擔心更新字段方法,有些更新方法是鎖定一行,如選擇f1,f2,f3從t1開始更新,爲字段f1,f2設置值f2 & f3並提交提交)

注意:bigProcess()方法不使用類Processor的任何實例變量。

回答

3

使BigProcess成爲Callable。當您將其提交到ExecutorExecutorService時,您將收到Future。如果在30-40個線程中執行future.get(),那些線程將阻塞,直到Callable完成。或者如果Callable已經完成,他們會立即返回結果。

另一種方法做到這一點(我很喜歡)是創建一個線程池,提交所有的工作到線程池。一旦所有的工作提交,關機並等待終止。它看起來是這樣的:

ExecutorService threadPool = Executors.newFixedThreadPool(40); 
// submit work 
threadPool.shutdown(); 
try { 
    threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
} catch (InterruptedException e) { 
    // do something 
} 

如果您有相關的工作(如任務B不能做,直到任務A完成),然後用從任務A一Future等創建任務B。

我喜歡這種方法,因爲一切都是暫時的。對於來自數據庫的單個加載,所有進程將被創建,運行並被丟棄。當你開始創建持久線程池時,你會引入另一個潛在的問題,並且很難弄清楚發生了什麼。

+0

感謝您的意見。您的解決方案適用於JDK 1.5及更高版本。但我正在使用JDK 1.4.2。你能否提供一種替代方法? – 2009-09-10 10:13:38

+0

我還沒有嘗試過這一個,但http://commons.apache.org/sandbox/threadpool/可能會幫助您解決類似於上面的問題。 – Buhb 2009-09-10 12:14:27

1

您是否需要同步您的方法取決於這些方法實際執行的操作。通常,如果有多個線程使用的資源(如數據庫中的單個文件或單個表(實際上正在寫入和正在讀取)),則需要進行同步。如果您正在運行的所有進程不互相干擾,則不需要同步。

+0

是的,線程確實使用普通表格,比如t1和t2。但是沒有兩個線程在任何表的相同行中操作。在這種情況下我們需要同步嗎? – 2009-09-10 10:06:04

+0

再次,這取決於。如果處理過程中的其中一個線程可能使數據庫處於不一致狀態,導致另一個線程無法正常工作,則需要進行同步。如果線程更新數據庫的順序不重要,則可能不需要同步。 – Bombe 2009-09-10 12:22:09