我需要ForkJoinTask为每个部门创建一个新的部门,并且不知道如何到达数组中的下一个位置。有人能帮我吗?protected static double parManyTaskArraySum(final double[] input, final int numTasks) { double sum = 0; // ToDo: Start Calculation with help of ForkJoinPool ForkJoinPool fjp = new ForkJoinPool(numTasks); fjp.execute(() -> { sum+=( 1 / input[???] ); //the problem is here }); return sum; }例外:从 lambda 表达式引用的局部变量必须是最终的或实际上最终的
1 回答
米脂
TA贡献1836条经验 获得超3个赞
您正在Runnable向您的ForkJoinPool. 因此,您无法使用所需的数组块对其进行参数化。
您实际上应该定义一个扩展类RecursiveTask<Double>,其构造函数将数组块作为参数,并决定是对整个数组进行操作还是在数组太大时进行分叉。
然后使用invoke您的方法ForkJoinPool来获取最终计算的结果,通过向其传递一个RecursiveTask<Double>采用整个数组的新实例(任务将根据您的标准决定是一次性完成所有操作还是分叉,例如,数组元素的一半转移到另一个任务并稍后加入)。
请注意,这里有些混乱。
事实上,如果您不需要利用 fork/join 框架而只想异步执行操作,那么有很多方法可以在不使用ForkJoinPool.
例如:
Callable<Double> call = () -> {return Arrays.stream(input).sum();};
Future<Double> future = Executors.newSingleThreadExecutor().submit(call);
// when you're ready
Double sum = future.get();
添加回答
举报
0/150
提交
取消