综合到目前为止的所有课程,实现这么一个并发算法:
计算给定函数 y=1/x 在定义域 [1,100]上围城与X轴围成的面积,计算步长0.01
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.function.Function;
/**
* 计算给定函数 y=1/x 在定义域 [1,100]上围城与X轴围成的面积,计算步长0.01
*/
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
//函数 1/x
Double, Double> func = (x) -> 1.0 / x;
Function<
double start = 1.0;
double end = 100.0;
double step = 1.0;
double microStep = 0.01;
List<Future<Double>> subAreas = new ArrayList<>();
for(double x = start; x < end ; x++) {
new CalcArea(func, x, Math.min(x+step, end), microStep);
CalcArea calc = add(executorService.submit(calc));
subAreas.
}double area = 0;
for(Future<Double> subArea : subAreas) {
get();
area += subArea.
}System.out.println(area);
shutdown();
executorService.
}
static class CalcArea implements Callable<Double> {
//要计算的函数
Double, Double> function;
Function<//区间起止点(左闭右开)
double start;
double end;
//步长
double step;
public CalcArea(Function<Double, Double> func, double start, double end, double step) {
this.function = func;
this.start = start;
this.end = end;
this.step = step;
}@Override
public Double call() {
double sum = 0;
// function 在 [start,end)区间内的近似积分
for(double x = start; x < end ; x += step) {
if(x + step <= end) {
apply(x) * step;
sum += function.else {
} apply(x) * (end - x);
sum += function.
}
}return sum;
}
} }
发表回复