Questão sobre Thread

[code]Given:

  1. public class Threads2 implements Runnable {
  2. public void run() {
  3. System.out.println(“run.”);
  4. throw new RuntimeException(“Problem”);
  5. }
  6. public static void main(String[] args) {
  7. Thread t = new Thread(new Threads2());
  8. t.start();
  9. System.out.println(“End of method.”);
  10. }
  11. }
    Which two can be results? (Choose two.)
    A. java.lang.RuntimeException: Problem
    B. run.java.lang.RuntimeException: Problem
    C. End of method. java.lang.RuntimeException: Problem
    D. End of method.run.java.lang.RuntimeException: Problem
    E. run.java.lang.RuntimeException: ProblemEnd of method.[/code]

Pessoal porque, quando o método run dispara a exception o main ainda exibe “End of method”? A aplicação nao era pra parar n?

Outra coisa executando esse codigo varias vezes ja saiu o seguinte resultado

[code]Exception in thread “Thread-0” java.lang.RuntimeException: Problem
at com.cast.C.run(C.java:9)
at java.lang.Thread.run(Unknown Source)
End of method.

run.[/code]

Como a JVM lançou a exception antes de exibir “run”?

Quem define a ordem de execução é o sistema operacional. Por isso, pode ser que a exception seja disparada antes ou depois de “End of method.”

Quando uma exception é disparada e não tratada, ela mata a thread que a disparou, as demais threads continuam rodando.

O programa só finaliza se essa for a única thread não-daemon da aplicação.

[quote=evertonsilvagomesjava]Outra coisa executando esse codigo varias vezes ja saiu o seguinte resultado

Exception in thread "Thread-0" java.lang.RuntimeException: Problem at com.cast.C.run(C.java:9) at java.lang.Thread.run(Unknown Source) End of method. run.

[/quote]

Isso não é possível. Você deve ter confundido a leitura do seu console.

Uma boa imagem sobre o assunto:

Fonte: http://www.javamex.com/tutorials/exceptions/exceptions_uncaught_handler.shtml

Veja só Vini na imagem


O que pode ser é o seguinte. O java usa duas saídas. A System.err (que o NB imprime em vermelho) e a System.out.
O que você viu aí é só um delay na exibição de uma delas. Mas com certeza o comando do run rodou antes da exception.

Tente trocar System.out.println(“Run”); por System.err.println(“Run”) e ver se o problema se repete.

[quote=ViniGodoy]O que pode ser é o seguinte. O java usa duas saídas. A System.err (que o NB imprime em vermelho) e a System.out.
O que você viu aí é só um delay na exibição de uma delas. Mas com certeza o comando do run rodou antes da exception.

Tente trocar System.out.println(“Run”); por System.err.println(“Run”) e ver se o problema se repete.[/quote]

Pouts é verdade funcionou agora a exception não ficou com o delay, foi exibida abaixo de “run”. System.err diferencia-se de System.ou pq exibi em vermelho? So isso?

São duas saídas diferentes. Numa o processo cospe os erros, na outra o processo cospe a saída normal.
É útil, pois você pode logar o err num lugar separado do out.

No caso do netbeans, o console dele é quem pinta de vermelho e joga tudo no mesmo lugar. Quando vc roda pelo DOS, o prompt de comando joga as duas juntas. Mas há como redirecionar uma delas. Se eu não me engano basta fazer algo assim:

Esse 1> e 2> não são comandos da VM, mas do próprio prompt de comando.

Veja que a classe Process, que representa um processo externo disparado por sua aplicação java, também tem dois métodos. Um chamado getOutputStream() e outro getErrorStream(). Num desses streams sai o que foi colocado no System.out, no outro o que for colocado no System.err do processo disparado.

São duas saídas diferentes. Numa o processo cospe os erros, na outra o processo cospe a saída normal.
É útil, pois você pode logar o err num lugar separado do out.

No caso do netbeans, o console dele é quem pinta de vermelho e joga tudo no mesmo lugar. Quando vc roda pelo DOS, o prompt de comando joga as duas juntas. Mas há como redirecionar uma delas. Se eu não me engano basta fazer algo assim:

Esse 1> e 2> não são comandos da VM, mas do próprio prompt de comando.

Veja que a classe Process, que representa um processo externo disparado por sua aplicação java, também tem dois métodos. Um chamado getOutputStream() e outro getErrorStream(). Num desses streams sai o que foi colocado no System.out, no outro o que for colocado no System.err do processo disparado.[/quote]

Muito Bom!! Vlww Vini!!