ExecutorService测试08

package t1;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestThread20 {
final static int LASTITER = 20;

public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(1);
Callable<BigDecimal> callable;
callable = new Callable<BigDecimal>() {

@Override
public BigDecimal call() throws Exception {
MathContext mc = new MathContext(100, RoundingMode.HALF_UP);// MathContext 规定有效数字的位数,以及如何处理小数误差
BigDecimal result = BigDecimal.ZERO;
for (int i = 0; i < LASTITER; i++) {
BigDecimal factorial = factorial(new BigDecimal(i));
BigDecimal res = BigDecimal.ONE.divide(factorial, mc);
result = result.add(res);
}
return result;
}

private BigDecimal factorial(BigDecimal n) {
if (n.equals(BigDecimal.ZERO))
return BigDecimal.ONE;
else
return n.multiply(factorial(n.subtract(BigDecimal.ONE)));
}
};
Future<BigDecimal> taskFuture = es.submit(callable);
while (!taskFuture.isDone())// 重要,可以判断线程是否执行完毕
System.out.println("waiting");
try {
System.out.println(taskFuture.get());
} catch (InterruptedException e) {
System.out.println("interrupted while waiting");
e.printStackTrace();
} catch (ExecutionException e) {
System.err.println("task throw an exception");
e.printStackTrace();
}
es.shutdownNow();
}

}

输出结果:

waiting
waiting
waiting
waiting
waiting

..........  ※略
waiting
waiting
waiting
2.718281828459045234928752728335199400298604372696647683315514840587507731038307661419544249349335776405657550833544368

 

posted @ 2020-04-01 09:19  工设091  阅读(69)  评论(0)    收藏  举报