Galera, sei que tem muita coisa na net sobre isso. Mas nao consegui achar uma solução para o meu problema.
PROBLEMA
Tenho 2 threads, uma que representa um servidor de socket - Thread1 e uma outra que trabalha as conexoes que foram armazenadas em uma lista Thread2. De acordo com a documentação do projeto eu tenho que pegar uma conexao de um equipamento e colocar ele em uma lista.
Quando vou usar essa lista na Thread2 esta dando java.util.ConcurrentModificationException como ja era de se esperar. Sincronizei os meu metodos, como descrito na classe abaixo. Outra coisa, nao posso colocar um sleep na Thread1, devido a conexao de equipamentos. Quando o equipamento solicitar uma conexao o servidor tem que estar alerta, nao pode estar dormindo igual vigia nortuno!!! Mesmo usando sleep na Thread2 ocorre java.util.ConcurrentModificationException, por que é nessa theard que vou fazer a validação dos equipamentos e enviar comandos para eles. Esse processo leva alguns segundos, pq estou acessando a base de dados.
abaixo os exemplos que estou tentando rodar
Classes
public class ServerTrataConexao implements Runnable {
private Numeros numeros;
public ServerTrataConexao() {
}
public ServerTrataConexao(Numeros s) {
numeros = s;
}
private void mostrarDados() {
try {
while (true) {
//Aqui eu trato as conexoes que foram
//Armazenadas no meu List
Thread.sleep(1000);
List<Integer> valor = numeros.getNumeros();
for (Integer i: valor) {
System.out.println("Valor da vez: " + i);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
mostrarDados();
}
}
public class ServerSocket implements Runnable {
private Numeros numeros;
public ServerSocket(Numeros s) {
numeros = s;
}
private void inserirNumeros() {
try {
//Suponhamos que aqui esta o meu servidor socket aguardando
//novas conexoes.
while (true) {
int numero = (int)(Math.random() * 100000);
numeros.setNumeros(numero);
Thread.sleep(50);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
inserirNumeros();
}
}
public class Numeros {
private List<Integer> numeros = new ArrayList<Integer>();
public synchronized void setNumeros(Integer numero1) {
numeros.add(numero1);
}
public synchronized List<Integer> getNumeros() {
return numeros;
}
}
Sei que o tema é bem antingo, nao sei se alguem ja passou por isso que estou passando.
Att