Вот моя проблема:
Этот фрагмент кода выдает java.util.ConcurrentModificationException
, потому что Vector
listeners
изменяется, пока существует Iterator
для этой структуры данных.
В документе java-doc сказано, что в этом контейнере есть только итератор, работающий без сбоев.
Есть ли возможность получить Iterator
поверх стандартного контейнера, такого как Vector
или List
в Java, который предлагает мне Iterator
, который не становится недействительным (не является отказоустойчивым), если есть удаляется ли элемент в течение этого Iterator
"жизни"?
У меня должно быть такое же поведение, как у std::list
в C ++. Там итератор всегда действителен, даже если текущий итератор удален. Чем итератор установлен для следующего элемента в списке.
public class ClientHandle {
private final Vector<ClientHandleListener> listeners = new Vector<ClientHandleListener>();
public synchronized void addListener(ClientHandleListener chl) {
listeners.add(chl);
}
public synchronized void removeListener(ClientHandleListener chl) {
listeners.remove(chl);
}
private void fireConnectionClosed() {
final ClientHandle c = this;
final Iterator<ClientHandleListener> it = listeners.iterator();
new Thread(){
@Override
public void run() {
while (it.hasNext()) {
it.next().connectionClosed(c); //FIXME the iterator gets modified
}
};
}.start();
}}
public class ClientHandlePool implements ClientHandleListener, TaskManagerListener {
/*...*/
public synchronized void removeClientHandle(ClientHandle ch) {
//here the listeners Vector from the ClientHandle gets modified
ch.removeListener(this);
ch.removeListener(currentListener);
clientHandles.remove(ch);
}
@Override
public void connectionClosed(ClientHandle ch) {
removeClientHandle(ch);
}
}