2011-11-01 80 views
2

我必須多線程運行1000批次的代碼。我需要將這些批次分配給不同的線程。如何在Java中使用多線程

目前我已經產生了3個線程,但所有3個挑選第一批1000個。 我希望其他批次不應選擇相同的批次,而應選擇其他批次。

請幫助並提出建議。

+2

上傳相關代碼 –

+2

能否請你告訴[SSCCE(http://sscce.org/)? – alf

回答

9

我會用一個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(); 
3

您需要將訪問權限同步到批處理中的作業列表。 (「同步」實質上意味着「確保線程知道潛在的競爭條件」,在大多數情況下,這意味着「讓某種方法一次由單個線程執行」。)

這是使用java.util.concurrent包。看看BlockingQueue的各種實現,例如ArrayBlockingQueueLinkedBlockingQueue

3

檢索批處理時使用lockmutex。這樣,線程不能同時訪問關鍵部分,也不會意外訪問同一批次。

我假設你一旦刪除一個批次被一個線程挑選出來。

編輯:aioobe和喬納斯的答案是更好的,使用它。這是一個替代方案。 :)