2012-11-13 51 views
1

傳輸多個線程之間的值,在java中:如何用Java

r1=complexCalc1(); 
r2=complexCalc2(); 
r3=complexCalc3(); 
r4=complexCalc4(); 
r5=complexCalc5(); 
return r1+r2+r3+r4+r5; 

假設運行時間像

complexCalc1() -> 5 mins 
complexCalc2() -> 3 mins 
complexCalc3() -> 2 mins 
complexCalc4() -> 4 mins 
complexCalc5() -> 9 mins 

如果此方案已按順序運行,將採取23 分鐘計算R1 + R2 + R3 + R4 + R5。如果每個函數並行運行,即每個線程所花費的總計時間中的每個函數complexCalc()函數爲r1 + r2 + r3 + r4 + r5計算需要9分鐘。

我的問題是如何實現它..我嘗試了幾種方法,但我仍然 弄清楚什麼具體。

在此先感謝。

+1

採取在遺囑執行人及期貨和[java.util.concurrent中]所有的好東西(HTTP一個戰利品: //docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html) – zapl

+0

就像一個筆記,並不一定是你會得到一個完美的併發量。如果這些計算中的每一個都有自己的核心來運行,並且沒有必要進行協調,那麼您可能會接近理想,但即便如此,也沒有保證。 – kjw0188

回答

1

如果您可以將任務劃分爲邏輯獨立任務(我相信您可以像您已經指出的那樣),那麼使用Java 5+就相當容易。

  • 在自己的可贖回
  • 實現每個任務他們都提交給執行。 ExecutorService.invokeAll(...)
  • 上述步驟返回,你將存儲,並確保所有的人都完成了名單(看API)

注意

  • 初始化線程池的大小是等於內核的數量(當然,你調整後的配置文件
  • 如果你可以有外部依賴性,那麼我建議使用Guava library來簡化執行程序的使用
2

的解決方案的初稿,只使用標準的Java API,看起來是這樣的:

public class Main { 
    private static final Callable<Integer> createCalculationSimulator (final int result, final int minutesToWait) { 
     return new Callable<Integer>() { 
      @Override 
      public Integer call() throws Exception { 
       Thread.sleep(minutesToWait*60*1000L); 
       return result; 
      } 
     }; 
    } 

    public static void main(String[] args) throws Exception {  
     final ExecutorService executorService = Executors.newFixedThreadPool (5); 
     final long startTime = System.currentTimeMillis(); 
     final List<Future<Integer>> results = executorService.invokeAll(
      Arrays.asList(
       createCalculationSimulator(1, 5), 
       createCalculationSimulator(2, 3), 
       createCalculationSimulator(3, 2), 
       createCalculationSimulator(4, 4), 
       createCalculationSimulator(5, 9))); 

     int resultSum = 0; 
     for (final Future<Integer> result : results) { 
      resultSum += result.get(); 
     } 
     final long endTime = System.currentTimeMillis(); 
     System.out.println("The end result is " + resultSum + ". Time needed = " + (endTime - startTime)/1000 + " seconds."); 
    } 
} 
+0

這裏缺少'executorService.shutdown()'方法。另外,解釋''result()''方法拋出時可能拋出'result()'很重要。 – Gray