Duvida Threads?

7 respostas
M
public class TwoThreads {
   private static Object resource = new Object();

   private static void delay(long n) {
      try { 
         Thread.sleep(n); }
      catch (Exception e) { 
            System.out.print(?Error ?); 
      }
   }

   public static void main(String[] args) {
      System.out.print("StartMain");
      new Thread1().start();
      delay(1000);
      Thread t2 = new Thread2();
      t2.start();
      delay(1000);
      t2.interrupt();
      delay(1000);
      System.out.print("EndMain");
   }

   static class Thread 1 extends Thread {
      public void run() {
         synchronized (resource) {
            System.out.print("Start");
            delay(6000);
            System.out.print("End1");
         }
      }
    }

   static class Thread2 extends Thread {
      public void run() {
         synchronized (resource) {
            System.out.print("Start2");
            delay(2000);
            System.out.print("End2");
         }
      }
   }
 }

Pessoal estou tentando achar a logica da saida dessas Threads mas não consigo alguem tem alguma dica macete:?: :?: :?:

7 Respostas

ViniGodoy

Vamos ver…

Main-Linha13: Imprime "StartMain"
Main-Linha14: Criada a thread1

Thread1-Linha 26: Adquire o resource
Thread1-Linha 27: Imprime "Start"
Thread1-Linha 28: Pausa por 6 segundos
Main-Linha15: Pausa por 1 segundo
Main(1 seg depois)-Acorda
Main-Linha16: Cria a thread 2
Main-Linha17: Inicia a thread 2
Thread2: Linha 26, Tenta adquirir o resource. Está de posse da thread1, portanto, dorme

Main-Linha18: Dorme por mais 1 segundo.
Main-Linha19: Chama interrupt na thread 2. Não está no delay, não lança exceção
Main-Linha20: Dorme por mais 1 segundo.
Main-Linha21: Imprime “EndMain”

Thread1 (após 3 segs): Acorda
Thread1-Linha 29: Imprime “End1”);
Thread1-Linha 30: Libera o resource e finaliza

Thread2-Linha 36: Consegue adquirir o resource
Thread2-Linha 37: Imprime "Start2"
Thread2-Linha 38: dorme por 2 segundos
Thread2-Linha 39: Imprime "End2"
Thread2-Linha 40: Libera o resource e finaliza

M

ViniGodoy valeu cara você poderia pegar o trabalho da JVM rs rs rs rs rs.
Qual é o segredo cara???

lfelipelias

Meu Thread é complicado mesmo pegar a manhã, alguém tem alguma dica que ajudou a entender os códigos de Thread?

M

Tambem estou esperando alguma ajuda

lfelipelias

Quando ao interrupt deixa eu ver se eu entendi…

Se você chamasse interrupt() em t1 ele lançaria uma InterruptedException e pularia para linha 7 e após executar o bloco catch retornaria para o bloco try caso houvesse mais alguma instrução e continuaria no bloco try até terminar?

Ou depois terminar a execução do bloco catch ele sairia sem continuar o resto do bloco try (caso houvessem mais instruções no bloco try)?

ViniGodoy

Não tem muito segredo… vc tem que imaginar que cada thread é um programa rodando em paralelo.

O método interrupt() faz com que os métodos sleep() e wait() das threads sejam interrompidos e disparem uma InterruptedException. Além disso, faz com que o método Thread.isInterrupted() passe a retornar true. Métodos como esse “delay” são pouco recomendados. O ideal é organizar os whiles de suas threads assim:

public void run() { try { while (!Thread.isInterrupted() && condição) { //Faz qualquer coisa } } catch (InterruptedException e){ //Normalmente pode deixar aqui em branco. //O tratamento foi justamente desviar o fluxo. } finally { //Seu código de finalização aqui }

Note que, dessa forma, se o interrupt() for chamado quando a thread estiver fora de um sleep() ou wait(), o while irá parar. Isso pq garantimos isso com a cláusula !Thread.isInterrupted(). Caso seja chamado dentro do sleep ou wait, o while também para, já que o try, catch desviará o fluxo para fora.

É assim que você faz com que threads sejam interrompidas. Você organiza o código para que o interrupt naturalmente feche a thread. E garante que um código de finalização seja executado (para você fechar arquivos, conexões com o BD, etc). Fazendo assim, você não precisará usar o método stop(), que é deprecated.

M

ViniGodoy valeu novamente cara

Criado 31 de julho de 2009
Ultima resposta 1 de ago. de 2009
Respostas 7
Participantes 3