我遇到了 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();
在类(class)开始时初始化。
以上方法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 及更高版本)上则不然。
最佳答案
您正在运行可并行代码(在单独线程中工作的代码),而没有任何同步。因此,各种线程可以以完全任意的方式相互交织。可能是 Java 7 使用了不同的调度机制,导致您的代码意外地正常工作。
如果您遇到过不同线程可能并行访问集合的情况,您可能需要将代码片段包装在 synchronized
block 中,以确保给定的代码片段以原子方式执行,而无需任何操作。来自其他线程的干扰。
关于java - TableView 中带有额外元素的 ObservableList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56293035/