AbstractTableModel 从不同的线程更新
AbstractTableModel updating from different threads
我有 class,它实际上是一些数据的列表,它扩展了 AbstractTableModel
。此 class 中的数据存储在线程安全的数组列表中。
但是如果我想添加一些数据,假设我在 class 中有这个方法扩展 AbstractTableModel
:
public void addData(Data data){
threadSafeArrayList.add(data);
fireTableRowsInserted(threadSafeArrayList.size()-1;threadSafeArrayList.size());
}
我应该在美国东部时间调用此方法中的所有内容。
然而,当一些其他线程循环遍历此列表以获取一些数据时,同时 EDT 想要将数据添加到此列表中。然后EDT被屏蔽了。
什么是 add/delte 数据的最佳实践 to/from table 许多其他线程使用的模型期望使用 SwingWorker
.
expect using SwingWorker
.
我也 期望 使用 SwingWorker
,但你的意思可能是 except SwingWorker
。
最佳做法是在 JDBCWorker
的 process()
实现中更新 event dispatch thread as shown 上的 TableModel
,SwingWorker
的子类。
或者,您可以使用 EventQueue.invokeLater()
更新 table 的模型,如图 here 所示,但该方法乏味且容易出错。详情见评论。
我有 class,它实际上是一些数据的列表,它扩展了 AbstractTableModel
。此 class 中的数据存储在线程安全的数组列表中。
但是如果我想添加一些数据,假设我在 class 中有这个方法扩展 AbstractTableModel
:
public void addData(Data data){
threadSafeArrayList.add(data);
fireTableRowsInserted(threadSafeArrayList.size()-1;threadSafeArrayList.size());
}
我应该在美国东部时间调用此方法中的所有内容。 然而,当一些其他线程循环遍历此列表以获取一些数据时,同时 EDT 想要将数据添加到此列表中。然后EDT被屏蔽了。
什么是 add/delte 数据的最佳实践 to/from table 许多其他线程使用的模型期望使用 SwingWorker
.
expect using
SwingWorker
.
我也 期望 使用 SwingWorker
,但你的意思可能是 except SwingWorker
。
最佳做法是在 JDBCWorker
的 process()
实现中更新 event dispatch thread as shown TableModel
,SwingWorker
的子类。
或者,您可以使用 EventQueue.invokeLater()
更新 table 的模型,如图 here 所示,但该方法乏味且容易出错。详情见评论。