2016-06-25 31 views
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) 
+2

将calculateMember的代码包装在try-catch中并打印所有异常。 –

+0

不是问题,但你应该使用['awaitTermination'](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination-long-java。 util.concurrent.TimeUnit-)而不是'isTerminated'上的忙碌循环 –

回答

相关问题