Galera,
Estou com o seguinte problema nas minhas Thrads.
Inicia a minha aplicação
  PonteEntreThread ponteEntreThread = new PonteEntreThread();
            ServidorDoGerenteDeEquipamento servidorDoGerenteDeEquipamento = new ServidorDoGerenteDeEquipamento(new Integer(mileSegundosGerenciaSocket), ponteEntreThread);
            Thread thread = new Thread(servidorDoGerenteDeEquipamento);
            thread.start();
            //Criar o servidor de socket aqui
            SViasLogger.logInfo(">> Subindo servidor socket");
            String porta = LerProperties.getValor("porta_servidor_gatway");
            SViasLogger.logInfo(">>Servidor socket ouvindo na porta: " + porta);
            ServerSocket serverSocket = new ServerSocket(new Integer(porta));
            SViasLogger.logInfo(">> Servidor aguardando conexão.");
            while (true) {
                Socket socket = serverSocket.accept();
                SViasLogger.logInfo(">> Mais um equipamento atendido.");
                try {
                    ServidorSocket servidorSocket = new ServidorSocket(ponteEntreThread, socket);
                    Thread thread2 = new Thread(servidorSocket);
                    thread2.start();
                } catch (Exception e) {
                    SViasLogger.logError("Principal-main", e);
                }
            }Classe que gerencia os equipamentos conectados - essa que é o PROBLEMA, jaja vou explicar.
public class ServidorDoGerenteDeEquipamento implements Runnable {
    private PonteEntreThread ponteEntreThread;
    private long tempoDoSleep;
    public ServidorDoGerenteDeEquipamento(long tempo, PonteEntreThread ponte) {
        ponteEntreThread = ponte;
        tempoDoSleep = tempo;
    }
    private void gerenciarConexoesDosEquipamentos() {
        SViasLogger.logInfo(">> Aguardando Trabalho!");
        List<SocketSVias> listaSocketSVias = Collections.synchronizedList(new ArrayList<SocketSVias>(ponteEntreThread.pegarListaDeSocketSVias()));
        SViasLogger.logInfo(">> Pegando Lista de Conexoes. Tamanho da Lista: " + listaSocketSVias.size());
        synchronized (listaSocketSVias) {
            for (SocketSVias socketSVias : listaSocketSVias) {
                GerenciaSocket gerenciaSocket = new GerenciaSocket(socketSVias);
                Thread thread = new Thread(gerenciaSocket);
                thread.start();
            }
        }
    }
    public void run() {
        while (true) {
            try {
                gerenciarConexoesDosEquipamentos();
                Thread.sleep(tempoDoSleep);
            } catch (Exception e) {
                SViasLogger.logError("ServidorDoGerenteDeEquipamento-run", e);
            }
        }
    }
}Classe que pega os meus equipamentos que conectaram e faz uma primeira validação dos equipamentos.
public class ServidorSocket implements Runnable {
    private PonteEntreThread ponteEntreThread;
    private Socket socket;
    public ServidorSocket(PonteEntreThread pet, Socket s) {
        ponteEntreThread = pet;
        socket = s;
    }
    private void servidorSocket() throws SViasException, InterruptedException, IOException {
        SViasLogger.logInfo(">>Equipamento Conectado, buscando os primeiros dados do equipamento.");
        String dadosRecebidosDoEquipamento = lerOsDadosDoEquipamentoConectado(socket);
        SViasLogger.logInfo(">>Dados do equipamento conectado:" + dadosRecebidosDoEquipamento);
        String imei = EquipamentoUtil.adquiriImeiEquipamentoConectado(dadosRecebidosDoEquipamento);
        if ("".equalsIgnoreCase(imei)) {
            return;
        }
        SViasLogger.logInfo(">>Equipamento de imei: " + imei + " conectado no servidor.");
        SocketSVias socketSVias = new SocketSVias(socket, "semcomando", imei);
        //buscar lista de equipamentos
        List<SocketSVias> lista = ponteEntreThread.pegarListaDeSocketSVias();
        if (lista.contains(socketSVias)) {
            SViasLogger.logInfo(">>Equipamento de imei: " + imei + " sendo validado, removido e inserido novamente na lista");
            int index = lista.indexOf(socketSVias);
            lista.remove(index);
            lista.add(socketSVias);
        } else {
            SViasLogger.logInfo(">>Equipamento de imei: " + imei + " sendo inserido na lista");
            lista.add(socketSVias);
        }
        SViasLogger.logInfo(">>Equipamento de imei: " + imei + " Validado na lista.");
    }
    public void run() {
        try {
            servidorSocket();
        } catch (Exception ex) {
            SViasLogger.logError("ServidorSocket-run", ex);
        }
    }
    private String lerOsDadosDoEquipamentoConectado(Socket cliente) throws SViasException, IOException {
        InputStream in = null;
        in = cliente.getInputStream();
        byte[] buffer = new byte[1024];
        int i = in.read(buffer);
        String retorno = new String(buffer);
        return retorno;
    }
}por fim tenho uma classe que denominei PonteEntreThread, essa classe possui uma lista dos equipamentos que estao conectados na minha aplicação.
public class PonteEntreThread {
    private List<SocketSVias> lista = new ArrayList<SocketSVias>();
    public synchronized List<SocketSVias> pegarListaDeSocketSVias() {
        return lista;
    }
    public synchronized void setarEquipamentosConectados(SocketSVias socketSVias) {
        lista.add(socketSVias);
    }
}
Entao galera, a classe ServidorDoGerenteDeEquipamento do nada para de funcionar, as outras thread’s continuam funcionando normalmente, ja esse cara que eu citei para de funcionar, não da erro, nada, simplesmente para.
O meu aplicativo esta em testes no cliente, fica no maximo 2 dias sem ser preciso reiniciar, passa um periodo maior ocorre o erro acima.
Onde estou errando nessas logicas minha?
Att