Chamar Thread Várias Vezes

6 respostas
programaçãojava
R

Galera estou com dificuldades em chamar um método que contém uma thread, simplesmente ele só chamar uma vez.
Fiz um for e dentro desse for ele chama o método que contém a thread. Segue o Código

public String conectar(final PtoEquipamento ptoequipamento) {
        final String EQUIPAMENTO_IP = ptoequipamento.getIp();
        final String EQUIPAMENTO_PORTA = ptoequipamento.getPorta();
        int qtde = 0;
        int maxTentativas = 5;
        boolean retorno = false;

        client = new TcpClient(EQUIPAMENTO_IP, Integer.valueOf(EQUIPAMENTO_PORTA));
        conectado = client.connect();

        if (client.isConnected()) {

            for (int i = 0; i < 10; i++) {
                executarProcedimento(conectado, ptoequipamento, client);
                Msg.addMsgInfo("Dados Recebidos ");
            }

        } else {

            for (qtde = 0; qtde < maxTentativas; qtde++) {
                Msg.addMsgError("Tentando Reconectar");
                client.connect();
                conectado = client.connect();
                if (client.isConnected()) {
                    retorno = executarProcedimento(conectado, ptoequipamento, client);
                    break;
                } else {
                    conectado = false;
                    client.disconnect();
                    retorno = false;
                }

            }
        }

public Boolean executarProcedimento(Boolean seConectado, final PtoEquipamento ptoequipamento, final TcpClient client) {

        conectado = seConectado;

        new Thread(new Runnable() {

            public void run() {

                try {

                    while (conectado) {

                        int temDados = enviarSolicitacaoRegistroPonto(client, ptoequipamento);

                        while (temDados > 0) {

                            char[] temp = client.receiveData(temDados); //RECEBENDO DADOS 

                            String str = "";
                            for (char chr : temp) {
                                if (chr == ']') {
                                    str = "";
                                }
                                if (Character.isDigit(chr)) {
                                    str += chr;

                                    if (str.length() == 34) {
                                        listaRegistros.add(str);

                                        int var = Integer.valueOf(str.substring(0, 9));
                                        int lastNSRInt = Integer.valueOf(lastNSR);
                                        if (var > lastNSRInt) {

                                            lastNSR = Integer.valueOf(str.substring(0, 9));
                                            nsr = lastNSRInt;

                                        }
                                        str = "";
                                    }
                                }
                            }

                            if (listaRegistros.size() > 0) {

                                try {

                                    manager.getTransaction().begin();

                                    for (String item : listaRegistros) {

                                        int nsr1 = Integer.valueOf(item.substring(0, 9));

                                        int tipo = Integer.valueOf(item.substring(9, 10));
                                        PtoArquivo arquivo = new PtoArquivo();

                                        String HrsString = item.substring(18, 22);
                                        String pisString = item.substring(22, 34);
                                        Date dataAtual = Data.parse(item.substring(10, 18));
                                        String Equipam = ptoequipamento.getDescricao();
                                        ptoequipamento.setUltimonsr(nsr1);

                                        if (tipo != 2) {

                                            arquivo.setEquipamento(Equipam);
                                            arquivo.setData(dataAtual);
                                            arquivo.setTipo(tipo);
                                            arquivo.setNsr(nsr1);
                                            arquivo.setHora(HrsString);
                                            arquivo.setPis(pisString);
                                            arquivo.setPtooriginal(item);

                                            manager.persist(arquivo);
                                            manager.merge(ptoequipamento);

                                        }

                                    }

                                    manager.getTransaction().commit();
                                    manager.close();

                                } catch (Exception e) {

                                }
                                conectado = false;
                                client.disconnect();

                            }
                        }
                        Thread.sleep(50);  //esperando resposta
                    }//FIM DO WHILE

                } catch (Exception e) {
                    conectado = false;

                }

            }
        }
        ).start();

        return false;
    }



public int enviarSolicitacaoRegistroPonto(TcpClient client, PtoEquipamento ptoequipamento) {

        String codigo = "01+RR+00+N]";
        String qtdeRegistros = "40]";
        String ultimoNSR = String.valueOf(ptoequipamento.getUltimonsr());
        String str1 = codigo + qtdeRegistros + ultimoNSR;

        char[] data = str1.toCharArray();
        String str = textFormat(data);

        client.sendData(str.toCharArray());

        int dados = client.availableData();

        return dados;
    }

6 Respostas

L

Não consegui identificar o problema, o código está bem desorganizado. Não acho que o problema está no fato de você chamar um método que starta threads, já que o método start não bloqueia, mas inicia uma thread nova.

Um exemplo:

class Main {

    public static void executarEmParalelo(Runnable op, int indice) {
        for (int i = 0; i < 5; i++) {
            String nome = "Thread " + i + " - " + indice;
            new Thread(op, nome).start();
        } 
    }

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            executarEmParalelo(criarRunnable(), i);
        }
    }

    public static Runnable criarRunnable() {
        final String templateStart = "Sou a thread %s e vou dormir 1 segundo.\n";
        final String templateError = "Deu ruim enquanto eu (thread %s) dormia.\n";
        final String templateEnd = "Terminei, vou morrer (thread %s)\n";
        Runnable r = () -> {
            final String meuNome = Thread.currentThread().getName();
            System.out.printf(templateStart, meuNome);
            try {
                Thread.sleep(1000); // dorme um segundo
                System.out.printf(templateEnd, meuNome);
            } catch (InterruptedException ex) {
                System.out.printf(templateError, meuNome);
                ex.printStackTrace();
            }
        };
        return r;
    }
}
R

Estou fazendo o for pra chamar 10 vezes o método executarProcedimento, porém só chama a mensagem e não chama o método 10 vezes.

public String conectar(final PtoEquipamento ptoequipamento) {

final String EQUIPAMENTO_IP = ptoequipamento.getIp();

final String EQUIPAMENTO_PORTA = ptoequipamento.getPorta();

int qtde = 0;

int maxTentativas = 5;

boolean retorno = false;
client = new TcpClient(EQUIPAMENTO_IP, Integer.valueOf(EQUIPAMENTO_PORTA));
    conectado = client.connect();

    if (client.isConnected()) {

        for (int i = 0; i < 10; i++) {
            executarProcedimento(conectado, ptoequipamento, client);
            Msg.addMsgInfo("Dados Recebidos ");
        }

    } else {

        for (qtde = 0; qtde < maxTentativas; qtde++) {
            Msg.addMsgError("Tentando Reconectar");
            client.connect();
            conectado = client.connect();
            if (client.isConnected()) {
                retorno = executarProcedimento(conectado, ptoequipamento, client);
                break;
            } else {
                conectado = false;
                client.disconnect();
                retorno = false;
            }

        }
    }
L

Chama sim (se der true no client.isConnected()), só que talvez o que o método faz não é o que você espera. Experimente colocar um print dentro do método executarProcedimento, e você vai ver que ele imprime 10 vezes. Coloque um breakpoint no começo do método conectar e siga o fluxo para entender melhor o que está acontecendo.

Você entendeu que quando cria e starta uma thread, ela é executada de forma completamente independente do fluxo de execução onde ela é criada? O método executarProcedimento faz basicamente isso:

conectado = seConectado;
new Thread(/*não faz diferença o que tem aqui dentro*/).start(); // starta uma nova thread e vai para a próxima instrução imediatamente
return false;
R

Realmente ele entra no for, porém não chama o método todas as vezes, chama somente 1 vez, já a mensagem chama todas as 10 vezes. O que acha que podes ser?

L

Cara, não faz o menor sentido o método ser chamado só uma vez. Se tá entrando no for e imprimindo 10 vezes o "Dados Recebidos ", tá chamando o método 10 vezes também. O que é muito mais provável de estar acontecendo é que o Runnable anônimo que você cria dentro do construtor da Thread não está fazendo o que você espera. As threads definitivamente estão sendo criadas e executadas, dado que o método é chamado 10 vezes. Quer fazer um teste? Coloca isso aqui dentro do método run:

//...
conectado = seConectado;
new Thread(new Runnable() {
    public void run() {
        // coloca esse print aqui
        System.out.println(Thread.currentThread().getName());
        try {
        //...
    }
}).start();
//...
R

Eu fiz o seguinte, retirei a Thread e executei o for para ver se iria chamar as 10 vezes e mesmo assim não foi.

Criado 21 de março de 2017
Ultima resposta 22 de mar. de 2017
Respostas 6
Participantes 2