Thread não executa o conteudo de run()

4 respostas
P

olá pessoas. Desculpe a minha ignorancia em threads . . . meu caso é o seguinte:

Tenho uma aplicação onde preciso inserir muitas informaçoes em meu banco, portanto preciso usar thread para não travar a GUI da minha aplicação.
Ate ai tudo bem . . . crio a classe que estende Thread sobrescrevo o metodo run(), porem quando estancio minha classe e dou um .start(), ele pula todo o codigo condicionado ( if() )
porem se eu executo o mesmo codigo fora da thread, ou seja dentro da mesma thread da main o codigo roda certinho. Segue o meu codigo pra vcs darem uma olhada.

<code>

<b>class </b>Salvar <b>extends </b>Thread{





        <a class="mention" href="/u/override">@Override</a>


        <b>public </b><b>void </b>run() {


            //Aqui meu codigo . . .


        modelo.Medico medico = <b>new </b>modelo.Medico();


        modelo.Agenda agenda = <b>new </b>modelo.Agenda();


        List list = <b>new </b>ArrayList();


        List data = <b>new </b>ArrayList();





        <b>if </b>(jR_Segunda.isSelected()) {


            list.add(1);





        }





        <b>try </b>{


            SimpleDateFormat formatter = <b>new </b>SimpleDateFormat(“kk:mm”);


            String hora1 = jSpinner1.getValue().toString().substring(11, 16);//pega os valores do Spinner


      (. . .)


            Date d1 = formatter.parse(hora1);  //transforma as strings em date


            (. . .)


            <b>try </b>{


                DateFormat df = <b>new </b>SimpleDateFormat(“dd/MM/yyyy”);


                Date dt1 = df.parse(“01/01/2011”);


                Date dt2 = df.parse(“15/01/2011”);


                Calendar cal = Calendar.getInstance();


                cal.setTime(dt1); //seta a data do calendario como dendo a primeira


                


                


    //THREAD RODA MAS PULA O FOR NESTE PONTO//





    <b>for </b>(Date dt = dt1; dt.compareTo(dt2) <= 0;) {





                    <b>if </b>(jR_Segunda.isSelected()) {//mostra so se for segunda


                        <b>if </b>(dt.getDay() == 1) {


                            <b>if </b>(d1 != d2) {


                                d1 = formatter.parse(hora1); // volta o valor da hora para a 


                                d2 = formatter.parse(hora2);// mesma selecionada no spinner


                                data.removeAll(data);


                                data.add(formatter.format(d1)); //adiciona data 1


                                <b>for </b>(<b>int </b>d = 0; d1.compareTo(d2) < 0; d++) {// compara as 2 datas


                                    agenda.setHoraI(formatter.format(d1));


                                    <b>long </b>lng = d1.getTime();//transforma data em long


                                    //pega o valor da combobox tempo e tranforma em multiplicador para a hora


                                    multi = Integer.parseInt(jXC_Tempo.getSelectedItem().toString().replace(“m”, “”).replace(“i”, “”).replace(“n”, “”).replace(".", “”).replace(" , “”));


                                    d1.setTime(lng + 60 <em> multi </em> 1000); // adiciona o valor do tempo a hora


                                    data.add(formatter.format(d1));//adiciona este valor ao arraylist


                                    agenda.setData(df.format(dt));


                                    agenda.setDia(1);


                                    agenda.setHoraF(formatter.format(d1));


                                    agenda.setId_medico(((modelo.Medico) jCb_Medico.getSelectedItem()).getId());


                                    agenda.setTempo_con(jXC_Tempo.getSelectedItem().toString());


                                    agenda.setTempo_exa(jXC_Tempo1.getSelectedItem().toString());


                                    agenda.setDias(list.toArray().toString());





                                    <b>if </b>(agend.inserirAgenda(agenda)) {


                                    } <b>else </b>{


           (. . .)


      }


    //A PARTIR DAQUI (DEPOIS DO FOR) A THREAD RODA EXECUTA O CODIGO//


                JOptionPane.showMessageDialog(");


            } <b>catch </b>(ParseException ex) {


                Logger.getLogger(CadastraAgenda.<b>class</b>.getName()).log(Level.SEVERE, null, ex);


            }





        } <b>catch </b>(Exception e) {


            System.out.println(e);


        }





       }


    }//fim de run()</code>

4 Respostas

WRYEL

se aquele trecho está pulando, ponha um ponto de debug no trecho: dt.compareTo(dt2) e veja o retorno deste método. Se estiver no eclipse, quando ele parar naquele ponto, selecione o trecho e aperte ctrl + shift + i :wink:

paulo1911

ola, como vc está chamndo a thread?

// tente isso
new Thread(new Save()).start()

fallow

ViniGodoy

No caso dele basta:

new Save().start()

Eu também usaria o depurador.

P

Valew pessoal pelas respostas . . .

Usei o debug e vi que ele estava com os campos vazios, por isso pulava o meu for().

Ai eu lembrei que como a jvm nao espera a thread terminar para executar o restante do meu metodo (lógico). . .
depois que eu fazia a chamada da thread new Salvar.start(); no mesmo metodo, ele estava limpando os valores contidos no campo e mostrando a mensagem de OK.

agora tirei essa parte e funcionou legal . . .

vlw pessoal

Criado 21 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 4
Participantes 4