2017-06-01 17 views
-1

我在循環中執行一些任務。我需要將這個120萬的循環分成多個線程。每個線程在列表中都會有一些結果。當所有線程完成時,我需要將所有線程列表數據添加到一個公共列表中。我無法使用ExecutorService。我怎樣才能做到這一點?如何將巨大的循環分成多個線程,然後將結果添加到集合中?

它應該與jdk 1.6兼容。

這是我在做什麼現在:

List<Thread> threads = new ArrayList<Thread>(); 
int elements = 1200000; 

public void function1() { 

     int oneTheadElemCount = 10000; 
     float fnum_threads = (float)elements/(float)oneTheadElemCount ; 
     String s = String.valueOf(fnum_threads); 
     int num_threads = Integer.parseInt(s.substring(0, s.indexOf("."))) + 1 ; 

     for(int count =0 ; count < num_threads ; count++) { 
      int endIndex = ((oneTheadElemCount * (num_threads - count)) + 1000) ; 
      int startindex = endIndex - oneTheadElemCount ; 

      if(count == (num_threads-1)) 
      { 
       startindex = 0; 
      } 
      if(startindex == 0 && endIndex > elements) { 
       endIndex = elements -1 ; 
      } 

      dothis(startindex,endIndex); 
     } 

     for(Thread t : threads) { 
      t.run(); 
     } 
    } 

public List dothis(int startindex, int endIndex) throws Exception { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      for (int i = startindex; 
        (i < endIndex && (startindex < elements && elements)) ; i++) 
      { 
       //task adding elements in list  
      }     
     } 
    });   
    thread.start(); 
    threads.add(thread); 
    return list; 
} 
+0

看着平行的流? –

+0

閱讀fork/join或Java 8中的Spliterators。 – BarrySW19

+0

它應該與jdk1.6兼容 – user3098231

回答

0

我不知道你正在使用的Java版本但在Java 7和更高版本,可以使用叉/加入ForkJoinPool

基本上,

叉/加入,在Java 7引入,並不意在替換或與現有的併發工具類競爭 ;取而代之的是它更新並且 完成它們。 Fork/Join可滿足分治的需要, 或Java程序中的遞歸任務處理(請參閱參考資料)。分叉/連接的邏輯非常簡單:(1)將每個大任務 分開(分叉)成更小的任務; (2)在單獨的線程中處理每個任務 (如果需要,將這些任務分成甚至更小的任務); (3)加入 結果。

Citation

有各種example在線,可以幫助它。我自己並沒有使用它。

我希望這會有所幫助。


對於Java6,你可以關注這個related SO question

+0

它應該與jdk 1.6兼容 – user3098231

+0

不幸的是,在Java 6中,您將不得不編寫自己的ForkJoinPool。 –

相關問題