我需要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
提交
取消