Ich schreibe ein kleines paralleles Programm für die Berechnung des Werts e
. Ich verstehe nicht, warum einige Werte im Array null sind, wenn alle Aufgaben im Thread-Pool beendet sind. Jede Hilfe zur Klärung, wo das Problem liegt, ist willkommen. Code ist unten:Warum bekomme ich Null-Werte, wenn alle Aufgaben die Ausführung beendet haben
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;
}
}
Die Ausnahme
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)
Wickeln Sie den Code von calculateMember in einen try-catch und drucken Sie alle Ausnahmen. –
Nicht das Problem, aber Sie sollten ['awaitTermination'] wirklich verwenden (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination-long-java. util.concurrent.TimeUnit-) anstelle einer aktiven Schleife für 'isTerminated' –