Ir ao conteúdo
  • Cadastre-se

Thread class com join para escrever ABC


Posts recomendados

Bom dia pessoal,

 

Preciso de uma ajuda para criar um programa que imprima ABC usando 3 threads, cada thread escrevendo um aletra.

 

Aguns detalhes, o programa principal só pode criar os objetos e dar o start neles, e não pode usar sleep, tem que ser o join. E o join não pode estar dentro do programa principal.

 

Fiz o seguinte:

 

public class Escrever extends Thread

{

       private String letra;

      

       public Escrever(String letra)

       {

              this.letra = letra;

       }

      

       @Override

       public void run ()

       {     

              try

              {

                     if ( letra == "A")

                     {

                           this.join(100);

                           System.out.print(letra);

                     }

                     else if ( letra == "B")

                     {

                           this.join(200);

                           System.out.print(letra);

                     }

                     else if ( letra == "C")

                     {

                           this.join(300);

                           System.out.print(letra);

                     }

              }

              catch (InterruptedException ie)

              {

                     ie.printStackTrace();

              }

       }

}

 

public class TestaEscrever {

    public static void main(String[] args) 
    {
        Escrever letra1 = new Escrever("A");
        Escrever letra2 = new Escrever("B");
        Escrever letra3 = new Escrever("C");
        
        letra1.start();
        letra2.start();
        letra3.start();
    }
}

 

Os codigos acima escrevem ABC sempre, mais o professor disse que está errada, não pode ser implementado assim passando os parametros para o metodo join.

 

Alguém teria uma ideia de como posso implementar da maneira correta ?

 

Obrigado,

Filipe

Link para o comentário
Compartilhar em outros sites

Olá,

 

não fez nenhum sentido chama "this.join()", pois estaria esperando a própria thread terminar sua execução, que nunca aconteceria, pois a thread está executando o join. Seria como dizer "vou sair de casa quando eu estiver do lado de fora".

O join espera que uma "outra" thread terminar sua execução.

Logo, se você tem uma ordem, é preciso saber qual a thread anterior e esperar que ela termine (ou seja, imprima a letra anterior e termine). Assim, você deve dar um join na thread anterior.

Segue o exemplo:

public class ABC extends Thread {

    private String letra;
    private Thread threadAnterior;

    public ABC(String letra, Thread threadAnterior) {
        this.letra = letra;
        this.threadAnterior = threadAnterior;
    }

    public void run() {
        try {
            if (threadAnterior != null) {
                // Aqui espera até que a thread anterior termine,
                // ou seja, espera a letra anterior ser escrita
                threadAnterior.join();
            }
            System.out.print(letra);
        } catch (Exception e) {

        }
    }
    
    public static void main(String[] args) {
        Thread a = new ABC("A", null);
        Thread b = new ABC("B", a);
        Thread c = new ABC("C", b);
        
        a.start();
        b.start();
        c.start();
    }

}

No exemplo, a "thread a" não precisa esperar ninguém, pois é primeira letra.

Já a "thread b" espera a "thread a" terminar, assim temos certeza que a letra A apareceu.

E a "thread c" espera a "thread b" terminar.

 

Logo primeiro aparece A, pois a "thread a" irá imprimir. Enquanto isso, a "thread b" está esperando a "thread a" terminar e a "thread c" esperando a "thread b" terminar.

Quando a "thread a" termina (ou seja, sai do método run), B é impresso, pois o join da "thread b" irá sair da chamada. E assim acontece para "thread c", mas logo após a "thread b" terminar (ou seja, imprime B e sai do run).

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...