Java 从内部 class 引用的多线程局部变量必须是最终的或有效的最终

Java MultiThreadding Local variables referenced from an inner class must be final of effectively final

我在 for 循环中使用多线程。我正在尝试 运行 每个线程的方法,其中包含在 for 循环内声明的一些参数。

我试过将变量移动到线程体中,它起作用了。除了变量 i 和 AccuraciesList.

     for (int i = 0; i < 30; i++) {

        String classifierName = "NaiveBayes";
        String dataFile = "decision_tree_image_dataset";
        String folderName = "dataset2_ff_time";
        String folder = "testFold";

        Instances dataSet = WekaTools.loadData(dataFile + ".arff");

        String path = "Results diagrams/" + folderName + "/" + classifierName;

        new Thread(new Runnable() {

            public void run() {
                try {

                    runThread(classifierName, folder, path, dataFile, i, accuraciesList, dataSet);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

无论我做什么,我仍然会遇到同样的错误。我真的需要在函数中传递 i 以及 accuraciesList

i 必须是 final 或在声明后没有值修改(有效的 final)。

因为它是一个循环迭代器,所以它不能是最终的,只需复制值并像这样使用复制的最终值。

final int iVal=i;
new Thread(new Runnable() {

    public void run() {
        try {

            runThread(classifierName, folder, path, dataFile, iVal, accuraciesList, dataSet);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();

这是由于 lambda 表达式的范围:

lambda 的范围与表达式的定义一致。因此,任何 在 lambda 表达式定义范围内的变量在 它代表的功能方法。这包括字段和最终或有效最终本地 变量(非最终局部变量,其值在初始化后不会改变)。

希望对你有帮助