2017-03-02 4 views
0

war ich nicht sicher, wie die Frage zu bilden ..Erhalte ich ConcurrentModificationException, wenn ich Objekte zu einer Warteschlange hinzufüge, während ich sie durchlaufe?

Grundsätzlich ich diesen Code haben:

java.util.Queue myQueue; 

... 

myQueue.stream().filter(particle -> particle instanceof ParticleDigging).forEach(particle -> { 
    myQueue.add(new ParticleSmoke()); 
}); 

Jetzt will ich wissen, was ist, wenn es einen ConcurrentModificationException irgendwann werfen würde.

Kann es sogar die Ausnahme mit .stream() werfen?

+1

Keine Ahnung, aber ich würde nicht versuchen, eine Sammlung zu ändern, während es Iterieren –

Antwort

1

Sie könnten eine ConcurrentLinkedQueue-Implementierung für Ihre Warteschlange verwenden. Wenn Sie sich die Java-Dokumente ansehen, werfen sie keine concurrentModificationException ab, weil sie intern einen Iterator verwenden.

ConcurrentLinkedQueue

Queue<Particle> myQueue = new ConcurrentLinkedQueue<>(); 

, wenn Sie in einen Strom umwandeln dann macht Strom eine spliterator die die gleiche Wirkung hat:

default Stream<E> stream() { 
     return StreamSupport.stream(spliterator(), false); 
    } 
Verwandte Themen