Duvida com thread

3 respostas
caiozanchetti

Galera me surgiu uma duvida quando eu tava fazendo um simulado aqui…
Olha soh:
se eu tivero seguinte codigo:

public class TestThread {
    public TestThread() {
        T t1 = new T("t1");
        T t2 = new T("t2");
        
        t1.start();
        System.out.println("apos t1");
        
        t2.start();
        System.out.println("apos t2");
    }
    
    public static void main(String[] args) {
        TestThread testThread = new TestThread();
    }
    
    
    class T extends Thread {
        public T(String name) {
            super(name);
        }
        
        public void run() {
            for (int i=0; i<20; i++)  {
                System.out.println(super.getName());
                currentThread().yield();
            }
        }
    }
}

O que vai acontecer eh que ele vai imprimir:
apos t1
apos t2
t1
t2
… os 2 ultimos aleatoriamente

Caso queiramos que ele imprima o apos t1 e apos t2 ao final de seus respectivos terminos deveriamos usar um join…

t1.start();
        try {
           t1.join()
        } catch(InterruptedException ie) {}
        System.out.println("apos t1");

blz isso resolve o problema.

o detalhe eh que eu usar usar:

public class TestThread {
    public TestThread() {
        T t1 = new T("t1");
        T t2 = new T("t2");
        
        t1.run();
        System.out.println("apos t1");
        
        t2.run();
        System.out.println("apos t2");
    }
    
    public static void main(String[] args) {
        TestThread testThread = new TestThread();
    }
    
    
    class T extends Thread {
        public T(String name) {
            super(name);
        }
        
        public void run() {
            for (int i=0; i<20; i++)  {
                System.out.println(super.getName());
                currentThread().yield();
            }
        }
    }
}

Tambem resolve o problema… ateh entao pensava que os dois metodos (start e run) se comportassem da msm maneira…

Eu tava lendo na api (se eu estiver errado por favor me corrijam) uma explicacao talvez seja q o metodo start na verdade apos sua chamada tera duas threads executando concorrentemente a thread que roda esta rodando o metodo start e que retornara o resultado, e outra que executará o metodo run().
Logo como no run isso nao acontece, havera apenas uma thread (ela nao precisara concorrer e/ou perder o processo para outra thread)

Se alguem souber melhor o que ocorre nesse caso, e eu falei besteira pode postar ai…

Vlw pessoal!

3 Respostas

Paulo_Silveira

chamar o metodo run da classe Thread é mais do que errado. foi um erro de design. e a sun cobrar isso na certificacao eh o fim da picada. e isso de cirar Thread estendendo a classe é horroroso… coisas da epoca do 1.0 (assim como os bizarros java.util.Properties e Stack)

se voce quer criar uma thread eh porque voce QUER que os dois “programas” rodem concorrentemente… eh isso que voce pensou mesmo.

diego2005

Acho que se você chamar o método run() ele não vai passar de um método comum, e vc não vai ter nenhum Thread de execução. Para colocar um Thread em estado executável vc deve chamar o método start().

Me corrijam se eu estiver errado…

caiozanchetti

Bah… obrigado pessoal… Concordo com a ideia de ambos…

Valeu mesmo…

Criado 21 de julho de 2006
Ultima resposta 21 de jul. de 2006
Respostas 3
Participantes 3