从内部类引用的Java MultiThreadding局部变量必须是有效final的final

时间:2019-05-06 11:44:35

标签: java multithreading variables netbeans local

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

我尝试将变量移动到线程主体,并且它可以工作。除了变量i和AccuraciesList。

enter image description here

     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();

    }

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

2 个答案:

答案 0 :(得分:2)

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();

答案 1 :(得分:0)

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

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

希望对您有帮助