Вы кормите 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();