Questão sobre Thread

9 respostas
evertonsilvagomesjav
Given:
1. public class Threads2 implements Runnable {
2.
3. public void run() {
4. System.out.println("run.");
5. throw new RuntimeException("Problem");
6. }
7. public static void main(String[] args) {
8. Thread t = new Thread(new Threads2());
9. t.start();
10. System.out.println("End of method.");
11. }
12. }
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.

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?

9 Respostas

evertonsilvagomesjav

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.

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

ViniGodoy

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.

ViniGodoy

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.

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

ViniGodoy

Uma boa imagem sobre o assunto:

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

evertonsilvagomesjav

Veja só Vini na imagem


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.

evertonsilvagomesjav

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.

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?

ViniGodoy

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.

evertonsilvagomesjav

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.

Muito Bom!! Vlww Vini!!

Criado 19 de agosto de 2010
Ultima resposta 19 de ago. de 2010
Respostas 9
Participantes 2