在 JavaFX 中,observableArrayList 线程安全吗?
In JavaFX, is an observableArrayList thread safe?
我通过修改可观察数组列表来更新 table,但现在 2 个线程可能会修改可观察数组列表。我应该将修改列表的代码放在同步方法中,还是只允许 1 个线程修改列表?
不,ObservableList
的实现只是一个包装器,它在普通 List
(普通 java 集合)
上添加了 listner 方法
所以不是线程安全的,你可以去看看ObservableListWrapper
的源码。
更多信息:https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
您可以通过调用
从 ObservableList 创建一个同步的 ObservableList
javafx.collectionsFXCollections.synchronizedObservableList(observableList)
这会为您的 observableList 创建一个包装器,您可以使用它来将项目添加到您的列表中。
问题是同步对您意味着什么。因为技术同步并不一定意味着它在您的业务需求方面是同步的,例如如果您必须通过在列表中连续调用 add(...) 两次来添加 2 个项目,并确保它们按顺序包含(中间没有其他项目)。也许无论如何你都必须确保不同级别的同步。
对于此特定用例 - ObservableList
绑定到 TableView
,您只能从 FX 应用程序线程访问列表。这是因为对列表的更改将导致 TableView
和 all changes to the scene graph must occur on the FX Application Thread.
的更改
所以在这种情况下,关于 ObservableList
是否线程安全的问题是一个有争议的问题:由于其他原因你只能从单个线程访问它,你不需要它来是。
如果您有一个需要更新列表的后台线程,您可以安排这些更新在 FX 应用程序线程上发生,方法是将它们包装在对 Platform.runLater(...)
, or (and this is probably preferable) by using the javafx.concurrent
API 的调用中以管理您的线程。
我通过修改可观察数组列表来更新 table,但现在 2 个线程可能会修改可观察数组列表。我应该将修改列表的代码放在同步方法中,还是只允许 1 个线程修改列表?
不,ObservableList
的实现只是一个包装器,它在普通 List
(普通 java 集合)
所以不是线程安全的,你可以去看看ObservableListWrapper
的源码。
更多信息:https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
您可以通过调用
从 ObservableList 创建一个同步的 ObservableListjavafx.collectionsFXCollections.synchronizedObservableList(observableList)
这会为您的 observableList 创建一个包装器,您可以使用它来将项目添加到您的列表中。
问题是同步对您意味着什么。因为技术同步并不一定意味着它在您的业务需求方面是同步的,例如如果您必须通过在列表中连续调用 add(...) 两次来添加 2 个项目,并确保它们按顺序包含(中间没有其他项目)。也许无论如何你都必须确保不同级别的同步。
对于此特定用例 - ObservableList
绑定到 TableView
,您只能从 FX 应用程序线程访问列表。这是因为对列表的更改将导致 TableView
和 all changes to the scene graph must occur on the FX Application Thread.
所以在这种情况下,关于 ObservableList
是否线程安全的问题是一个有争议的问题:由于其他原因你只能从单个线程访问它,你不需要它来是。
如果您有一个需要更新列表的后台线程,您可以安排这些更新在 FX 应用程序线程上发生,方法是将它们包装在对 Platform.runLater(...)
, or (and this is probably preferable) by using the javafx.concurrent
API 的调用中以管理您的线程。