我在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();
}
无论我做什么,我仍然遇到相同的错误。我真的需要在函数以及accuracyiesList中传递i
答案 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表达式的定义范围内的变量在 它代表的功能方法。这包括字段和最终或有效的最终本地 变量(初始化后值不变的非最终局部变量)。
希望对您有帮助