Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从内部类引用的Java多线程局部变量必须是final或final_Java_Multithreading_Variables_Netbeans_Local - Fatal编程技术网

从内部类引用的Java多线程局部变量必须是final或final

从内部类引用的Java多线程局部变量必须是final或final,java,multithreading,variables,netbeans,local,Java,Multithreading,Variables,Netbeans,Local,我在for循环中使用多线程。我试图为每个线程运行一个方法,该方法包含在for循环中声明的一些参数 我已经尝试过将变量移动到线程体中,并且效果很好。除了变量i和精度列表 不管我做什么,我还是会犯同样的错误。我真的需要在函数中传递I以及accuraciesListI必须是final,或者声明final后没有值修改 由于它不能是final,因为它是循环迭代器,所以只需复制该值并像这样使用复制的final值 final int iVal=i; new Thread(new Runnable() {

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

我已经尝试过将变量移动到线程体中,并且效果很好。除了变量i和精度列表

不管我做什么,我还是会犯同样的错误。我真的需要在函数中传递I以及accuraciesList

I必须是final,或者声明final后没有值修改

由于它不能是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表达式定义范围内的变量位于 它所代表的函数方法。这包括字段和最终或有效的最终本地 变量初始化后其值未更改的非最终局部变量

希望对你有帮助

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