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 表达式定义范围内的变量在
它代表的功能方法。这包括字段和最终或有效最终本地
变量(非最终局部变量,其值在初始化后不会改变)。
希望对你有帮助
我在 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 表达式定义范围内的变量在 它代表的功能方法。这包括字段和最终或有效最终本地 变量(非最终局部变量,其值在初始化后不会改变)。
希望对你有帮助