我有一些數據庫表,並且只要應用程序正在運行,就需要一次處理其中的記錄。因此,它看起來像這樣:需要設計「無限」線程的幫助
- 獲取尚未處理或尚未被其他線程處理的記錄。
- 處理它(這是一個很長的過程,取決於互聯網連接,因此它可能超時/拋出錯誤)。
- 移至下一條記錄。當到達桌子從頭開始結束時。
我沒有與線程太多的經驗,所以我看到兩種可能的策略:
方法A.
1,創建新的ExecutorService:
ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
2 。添加5個任務:
for (int i = 0; i < 5; i++) {
taskExecutor.execute(new MyTask());
}
3.每個任務都是無限循環,即:從表中讀取一條記錄,對其進行處理,然後獲取另一條記錄。
這種方法的問題是如何告知其他線程哪些記錄正在處理。要做到這一點,我可以在表中使用「status」字段,或者只使用一些CopyOnWriteArraySet來保存當前的處理ID。
方法B.
1.創建相同的ExecutorService:
ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
2.具有無限循環,其選擇需要被處理的記錄,並將它們傳遞給執行:
while (true) {
//get next record here
taskExecutor.execute(new MyTask(record));
//monitor the queue and wait until some thread is done processing,
//so I can add another record
}
3.每個任務處理單個記錄。
這種方法的問題是我需要將任務添加到執行程序的隊列中比處理它們要慢,以免它們隨着時間的推移而堆積起來。這意味着我不僅需要監視當前正在運行哪些任務,而且還需要監視它們何時處理完畢,因此我可以將新記錄添加到隊列中。
我個人認爲第一種方法更好(更容易),但我覺得第二種方法更爲正確。你怎麼看?或者我應該做一些完全不同的事情?
此外,如果需要,我可以使用Spring或Quartz庫。
謝謝。
執行人可以完全按照相同的模式提交的工作線程。您可以配置隊列,拒絕策略,線程數量,峯值線程數量等。 – 2009-02-23 05:45:13
+1 ArrayBlockingQueue – 2009-12-16 23:25:39