Duvida Threads?

[code] 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”);
}
}
}
}[/code]

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

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

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

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

Tambem estou esperando alguma ajuda

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)?

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.

ViniGodoy valeu novamente cara