ObservableList с дополнительными элементами в табличном представлении - PullRequest
0 голосов
/ 24 мая 2019

У меня проблема с ObservableList. Я добавляю элемент к ObservableList, а затем устанавливаю его на TableView, но проблема заключается в том, что всякий раз, когда я добавляю элемент к ObservableList, используя addAll(), некоторые дополнительные элементы отображаются в TableView.

Вот мой фрагмент кода

public void startRun(final TestCase test) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
    if (sessionConfig.isEnableSessionControl() || detailscol.isVisible() == false)
        saveReportBtn.setDisable(true);
    else
        saveReportBtn.setDisable(true);
    testCaseList.add(test);
    start = "Running";
    removerow++;
    startRunDataList = FXCollections.observableArrayList(new TestExecutionTable(test.getName(), start));
    updatedDataStartrun.addAll(startRunDataList);

    testExecutioTable.setItems(updatedDataStartrun);
    lastOne = startRunDataList.get(0);
   }
});
t.start();
}

, где testCaseList = new ArrayList<TestCase>(); startRunDataList = FXCollections.observableArrayList(); updatedDataStartrun= FXCollections.observableArrayList(); инициализируются в начале класса.

вышеуказанный метод startRun(final TestCase test) вызывается в цикле.

for (TestCase test : tests) {
        CountDownLatch latch = new CountDownLatch(1);
        listener.startSuite(null);

        listener.startRun(test);

        try {
            test.run(context, listener);
            listener.passed(test, latch);
        } catch (TestFailure failure) {
            listener.failed(test, failure, latch);
            //latch.wait();
        } catch (Throwable t) {
            listener.error(test, t, latch);
            //latch.wait();
        } finally {
            listener.endRun(test);
        }
    }

Однако приведенный выше код работает нормально с Java 7, но не с более поздней версией (Java 8 и более поздние).

1 Ответ

0 голосов
/ 24 мая 2019

Вы запускаете распараллеливаемый код (код, который работает в отдельных потоках) без какой-либо синхронизации. Как таковые, различные потоки могут переплетаться друг с другом совершенно произвольным образом. Возможно, в Java 7 использовался другой механизм планирования, из-за которого ваш код случайно работал правильно.

Если у вас когда-нибудь возникнет ситуация, когда разные потоки могут параллельно получать доступ к коллекции, вам может понадобиться обернуть фрагмент кода в блоки synchronized, чтобы гарантировать, что данный фрагмент кода выполняется атомарно без какого-либо вмешательства со стороны других потоков.

...