java - SwingWorker要更新TreeModel吗?

标签 java swing concurrency tree

我的应用程序中有很多 JTree,它们都使用同一自定义 TreeModel 类的不同实例(具有不同的选项)。我试图添加一些线程来加快速度,因为 getChildren() 成员需要一段时间才能运行,我向 TreeModel 添加了一个 SwingWorker 子类,并在 getChildren() 中创建了该工作线程的实例并执行它,然后返回它的 get() 结果。

我不断收到 ConcurrentModificationExceptions,并且我知道我应该同步某些内容,但不确定是什么。有人对如何保持我的 TreeModel 安全响应有任何建议吗?

谢谢! 约书亚

最佳答案

首先,我想知道您为什么尝试使用线程来加快速度。是 CPU 限制操作,还是网络/磁盘限制?

您的描述看起来好像您的 getChildren 在返回之前等待操作完成。这对于多核硬件上的并行操作可能很有用,但不是通用模型。通常我们(以及 SwingWorker 所做的)是在另一个线程上运行代码块,而事件调度线程可以自由地继续执行,直到它收到事件以处理来自后台线程的数据。

SwingWorker 没有记录它在任何地方抛出 ConcurrentModificationException 。堆栈跟踪可能会有所帮助。

我通常建议避免使用 SwingWorker。它非常适合创建一些演示操作,但设计很差。

线程化是困难的,特别是现在多线程硬件实际上bug更多。随意添加synchronized不会让问题消失。一个相对简单的通用方法是避免共享可变对象(或至少改变共享对象)。将一组 EDT 中未使用的参数传递到后台线程。同样,将未进行其他修改的参数传递回 EDT。

关于java - SwingWorker要更新TreeModel吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/846317/

相关文章:

java - netbeans 中的 Swing TableView

java - 组件不会出现

java - 如何更改循环内的 JTextField 值

ios - 在 UITableView 的单元格中下载图像的最佳实践?苹果/swift

concurrency - 代理是否应该只持有不可变的值

java - 计数变量不起作用

java - 如何在 Spring Boot Hibernate Multi-Tenancy 应用程序中使用 C3P0 来管理连接池?

java - 如何旋转矩形?

Java 定时器 Action 监听器

python - Python 的 file.write 是原子的吗?