2009-07-28 15 views
11

Bir iş parçacığında run() yöntemini çağırırsam ve run() yöntemi yakalanmamış bir istisna atarsa ​​sonuç ne olur?Bir Thread bir Özel Durum atarsa ​​ne olur?

Bu Özel Durumu kim yakalar? Yakalanmış mı?

+5

Bunu daha açık hale getirmek için - run() işlevini çağırmazsınız - kodun run() yönteminde kodu yeni yapmak için iş parçacığında start() öğesini çağırırsınız iplik. Run() 'ı doğrudan çağırmak sadece run yöntemini geçerli thread içinde yürütür. – Nate

cevap

8

ThreadGroup için bir istisna işleyicisi yüklüyse, JVM istisnayı ona geçirir. AWT iş parçacığı değilse, işlenmeyen özel durumlar için bir olay işleyicisi yükleyebilirsiniz. Aksi halde JVM onu ele alır.

özel işleyicisi ile bir iplik grubu örneği ve nasıl kullanılacağını: Bir üzere Runnable gönderdiyseniz

public class MyExceptionHandler { 
    public void handle(Throwable ex) { 
     // Handle exception 
    } 
    public void handle(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName()); 
+3

"Aksi takdirde JVM bunu işliyor." Daha kesin olmak gerekirse, istisnayı ortaya çıkaran iplik sessizce ölecektir. –

+0

@Stephen: Aslında bu özel durumu stderr'e yazdırır. – Draemon

+0

Gerçekten mi? JVM'ye özgü olmalı o zaman ... çünkü bir yığın izinin yokluğuna kapıldım. –

1

: Bir AWT istisna işleyicisi kullanmanın

public class MyThreadGroup extends ThreadGroup { 
    public MyThreadGroup() { 
     super("My Thread Group"); 
    } 
    public void uncaughtException(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... }; 
t.start(); 

Örnek ExecutorService, ExecutionException içine sarılmış Özel Durumu yakalayabilirsiniz. (Sadece koşarak çağırma() için önerilir)

İlgili konular