【问题标题】:Java MultiThreadding Local variables referenced from an inner class must be final of effectively finalJava 多线程从内部类引用的局部变量必须是 final 或有效 final
【发布时间】:2019-09-24 01:13:23
【问题描述】:

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

我已经尝试将变量移动到线程主体并且它有效。除了变量 i 和 AccuracyList。

     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

【问题讨论】:

    标签: java multithreading variables netbeans local


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是由于 lambda 表达式的作用域:

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        相关资源
        最近更新 更多