Java MultiThreadding Локальные переменные, на которые ссылаются из внутреннего класса, должны быть окончательными или фактически окончательными - PullRequest
0 голосов
/ 06 мая 2019

Я использую многопоточность в цикле 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();

    }

Я все еще получаю ту же ошибку, независимо от того, что я делаю. Мне действительно нужно, чтобы i передавался в функции, а также в accracyList

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

i должно быть либо как окончательное, либо не иметь изменения значения после объявления (фактически, окончательное).

Поскольку оно не может быть окончательным, так как оно является итератором цикла, просто скопируйте значение и используйте тот, что скопирован в концезначение как это.

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();
0 голосов
/ 06 мая 2019

Это связано с областью действия лямбда-выражения:

Область действия лямбды совпадает с определением выражения.Поэтому любые переменные, которые находятся в области действия при определении лямбда-выражения, находятся в области действия для функционального метода, который он представляет.Это включает в себя поля и окончательные или эффективно окончательные локальные переменные (не окончательные локальные переменные, значение которых не изменилось после инициализации).

Надеюсь, что вам поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...