为什么传递给 runnable 的变量需要是最终的?如何解决这个问题?

-1 java for-loop

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NewTest {

    public static void main(String[] args) {
        String mystr = "banana";

        ExecutorService executor = Executors.newFixedThreadPool(10);

        for (int i = 0; i < mystr.length(); i++) {
            Runnable task = () -> {
                System.out.print(mystr.charAt(i));
            };

            executor.submit(task);
        }

        executor.shutdown();
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ner 6

它们需要是最终的,因为你内部的变量Runnable与外部的变量是相同的:实际上,它们是不同的变量,具有相同的名称。

为了避免混淆,Java 强制在 内部使用的变量的值Runnable是最终的(或实际上最终的),以便它们不能在内部或外部更改Runnable,这意味着它们在内部和外部必须具有相同的值。

修复很简单:分配i给循环内的另一个(最终)变量:

for (int i = 0; i < mystr.length(); i++) {
    int ii = i;  // ii is effectively final.
    Runnable task = () -> {
        System.out.print(mystr.charAt(ii));
    };
    // ...
}
Run Code Online (Sandbox Code Playgroud)