Java 为什么当所有任务都完成执行时,我总是得到空值
我正在编写一个小型并行程序,用于计算Java 为什么当所有任务都完成执行时,我总是得到空值,java,parallel-processing,executorservice,bigdecimal,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 [] taylor
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;
}
}
import java.math.BigDecimal;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共班机{
私有静态BigDecimal[]TaylorseriesMebers;
公共静态void main(字符串[]args){
int系列化=20;
int threadCount=6;
Taylorseriesmebers=新的大十进制[序列化];
ExecutorService线程池=Executors.newFixedThreadPool(线程计数);
for(int i=0;i{
计算数(k);
});
}
threadPool.shutdown();
而(!threadPool.isTerminated()){
}
System.out.println(“所有任务已完成”);
BigDecimal答案=BigDecimal.0;
用于(BigDecimal bd:Taylorseriesmebers){
答案=答案。添加(bd);
}
System.out.println(answer.toString());
}
专用静态无效计算成员(int k){
BigDecimal first=新的BigDecimal(k*2+1);
BigDecimal second=bigFactoriel(2*k);
BigDecimal divided=第一个。divide(第二个);
泰勒塞斯梅贝尔斯[k]=分裂;
}
私有静态BigDecimal bigFactoriel(int k){
BigDecimal factNumber=BigDecimal.ONE;
if(k<2){
返回事实编号;
}
对于(int i=2;i问题在于调用divide
,您必须将其更改为:
BigDecimal divided = first.divide(second, MathContext.DECIMAL128);
出现异常。将calculateMember的代码包装在一个try catch中,并打印任何异常。这不是问题,但您应该真正使用,而不是在上有一个繁忙的循环
BigDecimal divided = first.divide(second, MathContext.DECIMAL128);