2016-06-25 7 views
1

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) 
+2

Wickeln Sie den Code von calculateMember in einen try-catch und drucken Sie alle Ausnahmen. –

+0

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' –

Antwort

Verwandte Themen