java - 为什么当所有任务都执行完后我总是得到空值

标签 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 [] 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;

}

}

异常

All tasks finished
Exception in thread "main" java.lang.NullPointerException
at java.math.BigDecimal.add(Unknown Source) // <-- in the for loop
at test.main.main(main.java:37)

最佳答案

问题出在divide的调用上,必须改成:

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

有一个ArithmeticException: “Non-terminating decimal expansion; no exact representable decimal result”出现。

关于java - 为什么当所有任务都执行完后我总是得到空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38031150/

相关文章:

java - 在java中取消 future 的任务

java - RequestMapping 占位符在 JUnit 测试中不起作用

javac 如何用通配符编译整个源目录?

java - JTable 中每一列都有唯一的 JMenu

multithreading - 使用 OpenMP 加速和调度

r - 避免在 R 中的 foreach 循环中增加内存

python - RabbitMQ 序列化来自多个消费者队列的消息

java - ExcecutorService什么时候执行失败?

java - okhttp中如何抑制Charset自动添加到Content-Type

java - 具有执行器框架的多个任务