在表视图中带有额外元素的ObservableList

时间:2019-05-24 12:48:56

标签: java javafx observablelist

我遇到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 :(得分:0)

您正在运行可并行化的代码(在单独的线程中工作的代码),而没有任何形式的同步。这样,各种线程可以以完全任意的方式相互缠绕。 Java 7可能使用了不同的调度机制,这导致您的代码意外正常工作。

如果遇到不同的线程可能并行访问集合的情况,则可能需要将代码片段包装在synchronized块中,以确保给定的代码片段被原子地执行而不会受到其他线程的干扰线程。