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();
}
}
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!