Tenemos un generador que va cargando una lista compartida, añadiendo 1 carácter cada segundo. Concurrentemente, el thread principal recorre el array copiando su contenido en una lista privada. Nótese cómo las adiciones del generador no se reflejan en la iteración en curso, pero sí en la siguiente iteración:
class Generador |
import java.util.List; import
java.util.TimerTask; public class Generador
extends TimerTask { private final List<Character>
compartida; private char c; public Generador(List<Character>
compartida) { this.compartida = compartida; c = 'A'; } @Override public void run() { System.out.println("Generador:
mete: " + c); compartida.add(c); c++; } } |
class ConcurrentList |
import java.util.ArrayList; import java.util.List; import java.util.Timer; import
java.util.concurrent.CopyOnWriteArrayList; public class
ConcurrentList { public static void main(String[] args) throws InterruptedException { List<Character> compartida =
new CopyOnWriteArrayList<Character>(); Generador generador = new Generador(compartida); Timer timer = new
Timer(); timer.schedule(generador, 1000,
1000); while (true) {
System.out.println("start"); List<Character> miLista =
new ArrayList<Character>(); for (Character ch : compartida) { miLista.add(ch); Thread.sleep(1000); } System.out.println("end:
" + miLista); System.out.println(); Thread.sleep(1500); } } } |
> java ConcurrentList |
start end: [] Generador: mete: A start Generador: mete: B end: [A] Generador: mete: C Generador: mete: D start Generador: mete: E Generador: mete: F Generador: mete: G Generador: mete: H end: [A, B, C, D] Generador: mete: I start Generador: mete: J Generador: mete: K Generador: mete: L Generador: mete: M Generador: mete: N Generador: mete: O Generador: mete: P Generador: mete: Q Generador: mete: R end: [A, B, C, D, E, F, G, H, I] ... |
Temas relacionados