我有一个JTree
,一些自定义TreeNode,一个扩展DefaultTreeModel的模型和一个为我的模型添加节点的线程。
这种情况有时会以非常高的频率发生。
我的节点由TreeSet支持,用于管理子节点:这样子节点总是被排序。
我的模型有add()
方法尝试添加节点。如果已存在具有相同标识符的节点,则不会更改任何内容(这将针对父节点的TreeMap的KeySet
进行检查。)
每当添加节点时,都会触发NodesInserted事件 这就是问题:由于使用了TreeMaps,每当添加节点时我的树会自行重新排序,传递给EventListeners的索引可能无法反映当侦听器处理NodesInserted时添加的节点的位置事件。对于负责重新绘制的默认侦听器也是如此。
因此,out-of-bound exception
会在某个时刻被抛出。
如何使此设置线程安全?
答案 0 :(得分:0)
http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));