dúvida sobre InterruptedException

2 respostas
B

Olá,

Estava estudando Threads para certificação e me deparei com esse código:

class MyThread implements Runnable {
  String name; // name of thread

  Thread t;

  MyThread(String threadname) {
    name = threadname;
    t = new Thread(this, name);
    System.out.println("New thread: " + t);
    t.start();
  }

  public void run() {
   try {
      for (int i = 5; i > 0; i--) {
        System.out.println(name + ": " + i);
        Thread.sleep(1000);
      }
    } catch (InterruptedException e) {
      System.out.println(name + " interrupted.");
    }
    System.out.println(name + " exiting.");
  }
}

public class MainClass {
  public static void main(String args[]) {
    MyThread ob1 = new MyThread("One");
    MyThread ob2 = new MyThread("Two");
    MyThread ob3 = new MyThread("Three");

    System.out.println("Thread One is alive: " + ob1.t.isAlive());
    System.out.println("Thread Two is alive: " + ob2.t.isAlive());
    System.out.println("Thread Three is alive: " + ob3.t.isAlive());

    try {
      System.out.println("Waiting for threads to finish.");
      ob1.t.join();
      ob2.t.join();
      ob3.t.join();
    } catch (InterruptedException e) {
      System.out.println("Main thread Interrupted");
    }

    System.out.println("Thread One is alive: " + ob1.t.isAlive());
    System.out.println("Thread Two is alive: " + ob2.t.isAlive());
    System.out.println("Thread Three is alive: " + ob3.t.isAlive());

    System.out.println("Main thread exiting.");
  }
}

Gostaria de entender melhor quando que pode ocorrer uma InterruptedException. Nesse código sou obrigado a tratá-la em duas partes do código, mas ela não é realmente lançada. Poderiam me explicar melhor e com detalhes a respeito da InterruptedException ?

Achei muito vaga a explicação da documentação oficial:
"Thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity."
Se ela pode ser lançada quando a thread está em sleep, waiting ou ocupada, quando a thread está em atividade ou não, então essa exceção pode ser lançada a qualquer momento praticamente?

Obrigado.

2 Respostas

V
Ela pode ocorrer sempre que o Java, por qualquer motivo, interromper a execução do wait, join,  sleep ou operação de I/O. As razões que isso geralmente acontecem são:

a) Alguma outra thread chama System.exit()

b) Um operação de I/O é interrompida pelo sistema operacional (por exemplo, porque um dispositivo móvel é retirado);

c) O sistema operacional envia um sinal para finalizar a VM.

d) Uma outra thread chamou interrupt;

Geralmente a interrupted exception é irreversível. Isso é, se ocorrer, sua VM estará morrendo e é a sua última chance de salvar algum dado.

A

A thread main espera cada uma thread terminar só depois conclui, agora vc ao usar o join vc não tá alterando as threads “One”, “two”, “Three” e sim a principal por isso não há exceção , para provocar uma exceção vc teria que fazer … ah não sei na vdd :? Pergunte pra alguém q sabe…

Criado 15 de novembro de 2012
Ultima resposta 16 de nov. de 2012
Respostas 2
Participantes 3