Java Swing / EDT事件处理同步

时间:2013-10-23 18:00:11

标签: java swing events synchronization event-dispatch-thread

我们在GUI日志中发现了一个ConcurrentModificationException异常,这似乎与更改支持表模型的列表有关。

订单似乎是:

  1. event1触发支持列表迭代并更改列表
  2. 更改列表会触发一个event2,它会中断当前执行(更改的副产品事件)。 此事件在处理event1结束
  3. 之前处理
  4. event2也改变了这个列表。
  5. event1获得控制权并继续其迭代,由于支持列表已更改而导致其崩溃
  6. 由于它们都在EDT上,如果我使用synchronized关键字(或锁定),在两个地方,event2会放弃并让event1处理继续,还是我会创建一个花哨的死锁?

1 个答案:

答案 0 :(得分:2)

  

似乎与更改支持表模型的列表有关。

您不应该更改列表。所有更新都应直接在模型上完成。

在许多情况下,如果你有一个ConcurrentModificationExecption,你可以将该代码包装在SwingUtilities.invokeLater()中,这样代码就会被添加到EDT的末尾,从而允许第一个事件完成处理。