Las Bibliotecas de JavaLas Bibliotecas de Java\CopyOnWriteArrayList (class) java.util.concurrentCopyOnWriteArrayList (class) java.util.concurrent\Ejemplo

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]

...

 

principio