我需要为每个分区创建一个新的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;
}
Exception: local variables referenced from a lambda expression must be final or effectively final
最佳答案
您正在喂养Runnable
lambda 到您的 ForkJoinPool
。
因此,您无法使用所需的数组 block 对其进行参数化。
您实际上应该定义一个扩展 RecursiveTask<Double>
的类其构造函数以数组 block 为参数,并决定是否对整个数组进行操作,或者如果数组太大则进行 fork 。
然后使用 invoke
你的方法ForkJoinPool
通过向其传递 RecursiveTask<Double>
的新实例来获取最终计算的结果获取整个数组(任务将根据您的标准决定是一次性完成所有操作,还是将数组元素的一半 fork 到另一个任务并稍后加入)。
注意,因为这里存在一些困惑。
如果事实上,您不需要需要利用 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();
关于java - 是否可以在 lambda 表达式中迭代数组? (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58543737/