Java 为什么当所有任务都完成执行时,我总是得到空值

Java 为什么当所有任务都完成执行时,我总是得到空值,java,parallel-processing,executorservice,bigdecimal,Java,Parallel Processing,Executorservice,Bigdecimal,我正在编写一个小型并行程序,用于计算e的值。如果线程池中的所有任务都完成了,我不明白为什么数组中的一些值是空的。欢迎在澄清问题所在方面提供任何帮助。代码如下: import java.math.BigDecimal; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class main { private static BigDecimal [] taylor

我正在编写一个小型并行程序,用于计算
e
的值。如果线程池中的所有任务都完成了,我不明白为什么数组中的一些值是空的。欢迎在澄清问题所在方面提供任何帮助。代码如下:

import java.math.BigDecimal;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class main {

private static BigDecimal [] taylorSeriesMemebers;

public static void main(String[] args) {

    int seriesSize = 20;
    int threadCount = 6;

    taylorSeriesMemebers = new BigDecimal[seriesSize];

    ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);

    for(int i = 0 ; i < seriesSize ; i++) {
        int k = i;
        threadPool.submit(() -> {
            calculateMember(k);             
        });
    }

    threadPool.shutdown();

    while(!threadPool.isTerminated()) {

    }

    System.out.println("All tasks finished");

    BigDecimal answer = BigDecimal.ZERO;
    for(BigDecimal bd : taylorSeriesMemebers) {
        answer = answer.add(bd);
    }

    System.out.println(answer.toString());
}


private static void calculateMember(int k) {

    BigDecimal first = new BigDecimal(k*2 + 1);

    BigDecimal second = bigFactoriel(2*k);


    BigDecimal divided = first.divide(second);
    taylorSeriesMemebers[k] = divided;


}

private static BigDecimal bigFactoriel(int k) {

    BigDecimal factNumber = BigDecimal.ONE;
    if ( k < 2 ) {
        return factNumber;
    }
    for(int i = 2; i <= k; i++) {
        factNumber = factNumber.multiply(new BigDecimal(i));
    }
    return factNumber;

}

}
import java.math.BigDecimal;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共班机{
私有静态BigDecimal[]TaylorseriesMebers;
公共静态void main(字符串[]args){
int系列化=20;
int threadCount=6;
Taylorseriesmebers=新的大十进制[序列化];
ExecutorService线程池=Executors.newFixedThreadPool(线程计数);
for(int i=0;i{
计算数(k);
});
}
threadPool.shutdown();
而(!threadPool.isTerminated()){
}
System.out.println(“所有任务已完成”);
BigDecimal答案=BigDecimal.0;
用于(BigDecimal bd:Taylorseriesmebers){
答案=答案。添加(bd);
}
System.out.println(answer.toString());
}
专用静态无效计算成员(int k){
BigDecimal first=新的BigDecimal(k*2+1);
BigDecimal second=bigFactoriel(2*k);
BigDecimal divided=第一个。divide(第二个);
泰勒塞斯梅贝尔斯[k]=分裂;
}
私有静态BigDecimal bigFactoriel(int k){
BigDecimal factNumber=BigDecimal.ONE;
if(k<2){
返回事实编号;
}

对于(int i=2;i问题在于调用
divide
,您必须将其更改为:

BigDecimal divided = first.divide(second, MathContext.DECIMAL128);

出现异常。

将calculateMember的代码包装在一个try catch中,并打印任何异常。这不是问题,但您应该真正使用,而不是在
上有一个繁忙的循环
BigDecimal divided = first.divide(second, MathContext.DECIMAL128);