2015-05-25 42 views
1

我試圖計算電子商務使用線程的時間儘可能少,我的任務給予用戶將傳遞一個變量與線程的量會用於計算,但我無法讓我的多線程正常工作以實現某種結果。我被告知,一個好的計算方法是使用下面的數學表達式:e = sum((3-4k^2)/((2k + 1)!)),其中k =(0;無窮大)。但到目前爲止,我只拿到了這個基本的方法:計算使用Java常數e多線程

public class MainClass { 
    public static long fact(int x) { 
     long p = 1; 
     for (int i = 1; i <= x; i++) 
      p = p * i; 
     return p; 
    } 

    public static void main(String[] args) { 
     double e = 1; 
     for (int i = 1; i < 50; i++) 
      e = e + 1/(double) (fact(i)); 
     System.out.print("e = " + e); 
    } 
} 
+2

*「我無法讓我的多線程正常工作」*您在哪裏嘗試使用多線程做些什麼? – Tom

+2

在這種情況下,我認爲您不會從多線程中獲益。更好地使用動態編程方法來計算這些「fact()」值。如果你使用'long'來存儲'x!':''log2(49!)= 208.5 ...' – fabian

+0

我沒有發佈多線程源代碼,因爲它非常糟糕。我只知道線程的基本知識,如 線程t =新線程(對象) 和 t.start().. –

回答

1

可以使用Java 8 parrallel Streams它更容易和更不容易出錯比explcitly創建線程。

import org.apache.commons.math.util.MathUtils; 

... 

public static double computeE(){ 
    return IntStream.iterate(0,k->k+1) 
        .limit(100000) 
        .mapToDouble(k->(3-4*k*k)/MathUtils.factorialDouble(2*k+1)) 
        .parallel() 
        .sum(); 
} 

在我的機器,它採用了兩個核心,並找到E = 2.718281828459045 10000迭代這是一個值,其中每一個數字是正確的。

+0

謝謝你的回答和反饋,我確實添加了一個問題,但不知何故,我在發佈之前刪除了它,但沒有注意到,對此我很抱歉。祝你有美好的一天! :) –