Mais uma de threads

O que vai acontecer quando o código for executado?

package teste;

public class Teste extends Thread {
  public void run() {
    metodo();
  }
  
  public synchronized void metodo() {
    try {
      wait();      
    }
    catch (InterruptedException e) {}
    
    outroMetodo();
    System.out.println("Done");
  }
  
  public void outroMetodo() {
    System.out.println("outroMetodo");
  }
  
  public static void main(String[] args) {
    Teste t = new Teste();
    t.start();
    
    try {
      Thread.sleep(5000);
    }
    catch (InterruptedException e) {}
    
    t.interrupt();    
  }
}
  1. Thread dorme por 5 Segundos // Thread.sleep(5000);
  2. Entra no método metodo
  3. Chama o método outroMetodo
  4. imprime outroMetodo
  5. Imprime Done

Diogo, o 1 e o 2 não estão invertidos?
Primeiro entra em metodo, fica bloqueado.
Volta ao main, dorme, acorda e interrompe t.

Depois o 3, 4 e 5 que você falou.

Então,

analisando o código e considerando o ciclo de vida de um Thread,

temos:

Teste t = new Teste();
//Deixa o segmento pronto para entrar no estado executável

t.start();
//Torna o segmento no estado executável, informando que se puder
//ser processado , ele pode.

então , ele entra no estado executando … que é nada mais do que chamar
o método run();

como no método run() existe um wait();
ele ficará esperando , e no main() , existe uma chamada ao método
interrupt() , mas antes de chamá-lo , o segmento dorme (sleep(5000))
por 5 segundos , isso para dar tempo de entrar no método run() e chamar
o wait(); eh tempo suficiente para isso.
E quando esse tempo acaba , segue o fluxo do main(), sabendo que
já existe uma espera na execução do segmento… wait(), e em nenhum lugar
do código , não foi chamado notify() ou notifyAll(),
então é executado o interrupt()., que verifica se existe algum Thread aguardando ser notificado ,e faz ele ser notificado.

Logo sairá:

outroMetodo
Done

é isso!