首先是一个任务
- class ExceptionDemo implements Runnable
- {
- @Override
- public void run() {
- int i=1/0;
- }
- }
然后启动线程运行的话还是会出现错误,程序直接结束,并没有捕获异常
- public void demo2()
- {
- try{
- ExecutorService ser=Executors.newCachedThreadPool();
- ser.execute(new ExceptionDemo());
- }
- catch(Exception e)
- {
- System.out.println(e.getMessage());
- }
- }
出现以下错误
Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
at thread.ExceptionDemo.run(JoinDemo.java:126)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
照理来说我已经写了try-catch了,应该是直接输出e.getMessage()的内容的,然而却出现了错误,无法捕获异常
后来想了想可能是这样的,在java的多线程中,每启动一个新的线程应该都会产生一个的线程栈,里面的任务在它新生成的线程栈里运行,跟你启动该线程的线程没有直接的关系,所以即使你在之前的线程里用了try-catch,但是在新的线程里并没有捕获已成的代码,所以运行时还是错了
后来看了看think in java中的解决办法,是为线程创建一个处理异常类Thread.UncaughtExceptionHandler
- class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler
- {
- @Override
- public void uncaughtException(Thread t, Throwable e) {
- // TODO Auto-generated method stub
- System.out.println("Thread:"+t.getName()+" throw exception,"+e.getMessage());
- }
- }
然后在你的新线程上加上
Thread t=new Thread(r);
t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());//附上异常处理就可以了
不对的地方请指教