Olá, segue minha implementação referente a aula de hoje
Realizei algumas modificações interessantes para facilitar meu entendimento.
Segue:
Classe Principal:
package br.com.alura.threads.lista.lista_thread_safe;
import java.util.List;
import java.util.Scanner;
public class Principal {
private static final Integer NUM_POSSIBILIDADES = 10000;
public static void main(String[] args) throws InterruptedException {
Scanner scanner = new Scanner(System.in);
System.out.println("Em primeiro lugar, implementa\u00E7\u00F5es que utilizam ArrayList<String> n\u00E3o s\u00E3o sincronizadas. Seguem op\u00E7\u00F5es para escolher qual implementa\u00E7\u00E3o testar:");
System.out.println("[1] - Testar com ArrayList mesmo - (n\u00E3o s\u00E3o sincronizadas)");
System.out.println("[2] - Primeira op\u00E7\u00E3o: Collections.synchronizedList() - (\u00E9 sincronizada)");
System.out.println("[3] - Segunda op\u00E7\u00E3o: Utilizar java.util.Vector - (\u00E9 sincronizada)");
System.err.println("[4] - Sair");
Integer opcao = scanner.nextInt();
if (opcao == 4) {
scanner.close();
System.out.println();
System.err.println("Opera\u00E7\u00E3o finalizada!!");
return;
}
scanner.close();
Lista lista = new Lista();
lista.inicializaLista(opcao);
List<String> elementos = lista.getElementos();
for (int i = 0; i < 100; i++) {
new Thread(new TarefaLista(elementos, i)).start();
}
for (int i = 0; i < elementos.size(); i++) {
System.out.println(lista.pegaElemento(i));
}
System.err.println("Tamanho da lista: " + lista.tamanho(elementos));
System.err.println("Faltam " + (NUM_POSSIBILIDADES - lista.tamanho(elementos)) + " elementos");
Thread.sleep(2500);
System.out.println();
System.err.println("Opera\u00E7\u00E3o finalizada!!");
}
}
Classe Lista:
package br.com.alura.threads.lista.lista_thread_safe;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
public class Lista {
private List<String> elementos;
public void inicializaLista(Integer opcao) {
switch (opcao) {
case 1:
this.elementos = new ArrayList<String>();
break;
case 2:
this.elementos = Collections.synchronizedList(new ArrayList<String>());
break;
case 3:
this.elementos = new Vector<String>();
break;
default:
break;
}
}
public void adicionaElementos(String elemento) {
this.getElementos().add(elemento);
}
public Integer tamanho(List<String> lista) {
return this.getElementos().size();
}
public String pegaElemento(Integer indice) {
String elemento = "";
try {
elemento = this.getElementos().get(indice);
} catch (Exception e) {
System.err.println(e.getMessage());
}
if (elemento == "") {
elemento = "Elemento n\u00E3o encontrado!";
}
return elemento;
}
public List<String> getElementos() {
return elementos;
}
public void setElementos(List<String> elementos) {
this.elementos = elementos;
}
}
Classe TarefaLista:
package br.com.alura.threads.lista.lista_thread_safe;
import java.util.List;
public class TarefaLista implements Runnable {
private List<String> lista;
private Integer contador;
public TarefaLista(List<String> lista, Integer contador) {
this.lista = lista;
this.contador = contador;
}
@Override
public void run() {
adicionaElementoNaLista(lista, contador);
}
private void adicionaElementoNaLista(List<String> listaElemento, Integer contadorElemento) {
for (int i = 0; i < 100; i++) {
listaElemento.add("Thread " + contadorElemento + " - " + i);
}
}
}
Obrigado.