说到异常:异常大体可分为checked异常,错误(Error)、和运行期异常(RuntimeException)。首先明确了一点,线程代码不能抛出任何checked异常。所有的线程中的checked异常都只能被线程本身消化掉。这也符合线程作为独立执行片段,需要对自己负责的设计理念。
除此以外,线程代码中是可以抛出错误(Error)和运行级别异常(RuntimeException).但是错误异常一般都是交给vm去处理,这里我们可以将其忽略。而RuntimeException确是比较正常的,如果在运行过程中满足了某种条件导致线程必须中断,可以选择使用抛出运行级别异常来处理.
处理方法:通过ThreadGroup的uncaughtException方法。当线程抛出uncaughtException的时候,JVM会调用ThreadGroup的此方法。[code]public class ApplicationLoader extends ThreadGroup {
private ApplicationLoader() {
super("ApplicationLoader");
}
public static void main(String[] args) {
Runnable appStarter = new Runnable() {
public void run() {
// invoke your application (i.e.MySystem.main(args)
throw new NullPointerException(); // example, throw a runtime
}
};
new Thread(new ApplicationLoader(), appStarter).start();
}
// We overload this method from our parent
// ThreadGroup , which will make sure that it
// gets called when it needs to be. This is
// where the magic occurs.
public void uncaughtException(Thread thread, Throwable exception) {
// Handle the error/exception.
// Typical operations might be displaying a
// useful dialog, writing to an event log, etc.
exception.printStackTrace();// example, print stack trace
}
}[/code]以上代码就可以实现线程的异常捕捉。每个Thread都会有一个ThreadGroup对象,可以通过Thread.getThreadGroup()方法得到,此方法提供了上述默认的uncaught异常处理方法。
虽然可以处理,不过还是强调一点:线程的问题应该线程自己本身来解决,而不要委托到外部! |