在非事件派发线程中调用fireTableRowsUpdated()是否安全?

时间:2013-05-17 16:47:16

标签: java swing

我需要在事件分派线程的单独线程内以固定间隔更新JTable的某些单元格。其他单元格只能由事件调度线程更新,以便两个线程永远不会更新同一个单元格。

更改JTable的数据后,通常的方法是调用fireTableRowsUpdated()重新绘制JTable。通常,您在事件调度线程中调用fireTableRowsUpdated(),但我可以在另一个线程中调用它吗?如果是这样,fireTableRowsUpdated()也是线程安全的吗? <{1}}有可能同时更新。

2 个答案:

答案 0 :(得分:3)

来自JTable的文档:

  

警告:Swing不是线程安全的。有关更多信息,请参阅Swing的线程策略。

以下links

  

一般来说,Swing不是线程安全的。除非另有说明,否则必须在事件派发线程上访问所有Swing组件和相关类。

更重要的是你的问题:

  

此限制也适用于附加到Swing组件的模型。例如,如果将TableModel附加到JTable,则只应在事件分派线程上修改TableModel。

现在,碰巧你可以做很多违反这项政策的事情。但是,为什么在创建SwingWorker保证以便您的代码 线程安全时很容易呢?

答案 1 :(得分:2)

如果您只想将执行传递给Event Dispatcher Thread

,请使用SwingUtilities.invokeLater()代替SwingWorker

有关SwingUtilities.invokeLater

的更多信息