1.100!所得结果较长需要用BigInteger数据类型来储存结果
2.BigInteger运算语法 BigInteger t;
加法 t.add()
减法t.subtract()
乘法t.multiply()
除法t.divide()
幂运算 t.pow()
取余 t.remainder()
绝对值t.abs();
...
本文中用到的其他语法 判断 BigInteger数据是否相等 t.compareTo() ,若小于值为-1,等于为0,大于为1.
源代码:
SumTask.java
import java.math.BigInteger;
import java.util.Random;
import java.util.concurrent.Callable;
public class SumTask implements Callable<BigInteger> {
//定义每个线程计算的区间
private BigInteger startNumber;
private BigInteger endNumber;
//上一次任务运算结果
private BigInteger result;
public SumTask(BigInteger startNumber, BigInteger endNumber,BigInteger result){
this.startNumber=startNumber;
this.endNumber=endNumber;
this.result = result;
}
@Override
public BigInteger call() throws Exception {
BigInteger temp = new BigInteger("1");
while(startNumber.compareTo(endNumber)!=1)
{
result = result.multiply(startNumber);
startNumber = startNumber.add(temp);
}
Thread.sleep(new Random().nextInt(1000));
System.out.printf("%s: %d\n",Thread.currentThread().getName(),result);
return result;
}
}
SumTest.java
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
public class SumTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
BigInteger temp2;
//用于存储上一次任务所得结果
BigInteger temp1 = new BigInteger("1");
//固定值
BigInteger temp = new BigInteger("1");
BigInteger end = new BigInteger("10");
//将第几次循环的Int类型数据转换为String类型
String temp4;
// 执行线程池
ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(10);
List<Future<BigInteger>> resultList=new ArrayList<>();
List<Future<BigInteger>> resultList1=new ArrayList<>();
for (int i = 0;i<10;i++)
{
temp4 = String.valueOf(i);
temp2 = new BigInteger(temp4);
SumTask calculator = new SumTask(temp2.multiply(end).add(temp),temp2.add(temp).multiply(end),temp1);
Future<BigInteger> result=executor.submit(calculator);
resultList1.add(result);
resultList.add(result);
Future<BigInteger> result1 = resultList.get(i);
temp1 = result1.get();
}
// 每隔50毫秒,轮询等待10个任务结束
do {
System.out.printf("Main: 已经完成多少个任务: %d\n",executor.getCompletedTaskCount());
for (int j=0; j<resultList1.size(); j++) {
Future<BigInteger> result=resultList1.get(j);
System.out.printf("Main: Task %d: %s\n",j,result.isDone());
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (executor.getCompletedTaskCount()<resultList.size());
// 所有任务都已经结束了,综合计算结果
BigInteger total = new BigInteger("0");
for (int j=0; j<resultList1.size(); j++) {
Future<BigInteger> result=resultList1.get(j);
BigInteger sum;
try {
sum=result.get();
total = total.add(sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.printf("100!总和:" + total);
// 关闭线程池
executor.shutdown();
}
}