1
我正在写一个小型并行程序来计算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)
将calculateMember的代码包装在try-catch中并打印所有异常。 –
不是问题,但你应该使用['awaitTermination'](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination-long-java。 util.concurrent.TimeUnit-)而不是'isTerminated'上的忙碌循环 –