我必須多線程運行1000批次的代碼。我需要將這些批次分配給不同的線程。如何在Java中使用多線程
目前我已經產生了3個線程,但所有3個挑選第一批1000個。 我希望其他批次不應選擇相同的批次,而應選擇其他批次。
請幫助並提出建議。
我必須多線程運行1000批次的代碼。我需要將這些批次分配給不同的線程。如何在Java中使用多線程
目前我已經產生了3個線程,但所有3個挑選第一批1000個。 我希望其他批次不應選擇相同的批次,而應選擇其他批次。
請幫助並提出建議。
我會用一個ExecutorService
int numberOfTasks = ....
int batchSize = 1000;
ExecutorService es = Executors.newFixedThreadPool(3);
for (int i = 0; i < numberOfTasks; i += batchSize) {
final int start = i;
final int last = Math.min(i + batchSize, numberOfTasks);
es.submit(new Runnable() {
@Override
public void run() {
for (int j = start; j < last; j++)
System.out.println(j); // do something with j
}
});
}
es.shutdown();
您需要將訪問權限同步到批處理中的作業列表。 (「同步」實質上意味着「確保線程知道潛在的競爭條件」,在大多數情況下,這意味着「讓某種方法一次由單個線程執行」。)
這是使用java.util.concurrent
包。看看BlockingQueue
的各種實現,例如ArrayBlockingQueue
或LinkedBlockingQueue
。
將批次放在BlockingQueue
中,讓您的工作線程從隊列中取出批次。
檢索批處理時使用lock
或mutex
。這樣,線程不能同時訪問關鍵部分,也不會意外訪問同一批次。
我假設你一旦刪除一個批次被一個線程挑選出來。
編輯:aioobe和喬納斯的答案是更好的,使用它。這是一個替代方案。 :)
上傳相關代碼 –
能否請你告訴[SSCCE(http://sscce.org/)? – alf