Java线程异常处理
一 线程类型
Java程序使用的线程分为两类:
- 手动创建的线程
- 线程池管理的线程
二 异常默认处理
对于手动创建的线程,线程运行过程中抛出未捕获的异常的默认行为如下:
1 线程终止,异常信息及堆栈输出到标准错误流(System.err())
2 阻塞线程(Thread.join())正常执行
对于线程池管理的线程,线程运行过程中抛出未捕获的异常的默认行为根据发起任务的方式分为两种情况:
- Executor.execute()
1 线程终止,异常信息及堆栈输出到标准错误流(System.err())
2 阻塞线程(Executor.awaitTermination())正常执行
- Executor.submit()
1 线程终止,无异常信息输出
2 阻塞线程(Executor.awaitTermination())正常执行
3 阻塞线程(Future.get())抛出异常信息
三 异常处理
异常处理有两种方式,推荐方式1
1 在任务中捕获异常并处理
2 对于手动创建的线程及线程池Executor.execute()处理线程,可在新建线程时通过Thread.setUncaughtExceptionHandler()指定处理方法。该方法对Executor.submit()处理线程无效,须在阻塞线程主动调用Future.get(),再捕获异常