2015-05-25 28 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

谢谢你的回答和反馈,我确实添加了一个问题,但不知何故,我在发布之前删除了它,但没有注意到,对此我很抱歉。祝你有美好的一天! :) –