Duvida com threads:join(5000) não funciona

3 respostas
D

Boa noite, pessoal estou tendo uma certa dificuldade em entender as threads, devido a isto estou uma pesquisando
aqui no forum achei vários tópicos que ajudaram esclarecer alguns conceitos.
No entanto, achei o código abaixo:

public class Thread30 extends Thread{   
    public void restart(){   
        startMe();   
    }   
    public  void startMe() {   
        synchronized (this) {   
                notifyAll();   
                System.out.println("Trying To Notify");               
        }   
    }   
    public void run(){   
        try{   
            synchronized (this) {   
                wait();   
                System.out.println("Notified");   
            }   
        }catch(InterruptedException e){ }   
    }   
    public static void main(String[] args) throws InterruptedException{   
        Thread30 t1 = new Thread30();   
        t1.start();
        t1.restart();
        }   
}

Entendi que a thread main e thread t1 estão em condição de corrida e caso a main vença só será "Try to notify ".
A minha JVM só permite que a thread main ganhe, fiquei pensado em solução que permitisse que as duas mensagens fossem impressas.
a primeira funcionou:

public static void main(String[] args) throws InterruptedException{   
        Thread30 t1 = new Thread30();   
        t1.start();
        Thread.sleep(1000);
        t1.restart();
        }

A segunda eu pensei em usar join sobrecarregado:

public static void main(String[] args) throws InterruptedException{   
        Thread30 t1 = new Thread30();   
        t1.start();
        t1.join(1000);
        t1.restart();
        }

Pelo o que o entendi do join ele iria anexar a thread main no final da thread t1 assim que t1 acabasse sua execução o main continuaria.
Neste caso a thread main esperaria 1 segundo para que completasse sua execução, mas o programa trava e não imprime nada.

Eu agradeço as explicações.

3 Respostas

lipe82

Oi Daniel, tentei executar seu código e no meu caso foi o primeiro programa que travou.

o método restart() iniciou mais rápido que a Thread inicia e a saída foi “Trying To Notify” e ficou porai. O wait ficou esperando outro notifyAll e o programa ficou travado.

edilson_x

Olha o que acontece neste ponto :

public void run(){ try{ synchronized (this) { wait(); System.out.println("Notified"); } }catch(InterruptedException e){ } }

quando a Thread Thread30 ganha a execução, é feita uma chamada ao metodo wait() sem passar o tempo de espera,
isso faz com que a Thread pare a execução e aguarde uma instrução para “acordar”.

D

edilson_x:
Olha o que acontece neste ponto :

public void run(){ try{ synchronized (this) { wait(); System.out.println("Notified"); } }catch(InterruptedException e){ } }

quando a Thread Thread30 ganha a execução, é feita uma chamada ao metodo wait() sem passar o tempo de espera,
isso faz com que a Thread pare a execução e aguarde uma instrução para “acordar”.

Eu usei i wait com tempo de espera e funcionou do apareceu as duas mensagens, mas eu tentei fazer isto ontem a noite o programa travado.Obrigado pessoal esclareceu muita coisa.
Agora até a primeira versão que eu postei com sóo join sobrecarregado está funcionado.

Criado 30 de março de 2009
Ultima resposta 31 de mar. de 2009
Respostas 3
Participantes 3