《Java并发》:第五节 线程异常处理
来源:互联网 发布:excel预测未来数据 编辑:程序博客网 时间:2024/06/05 07:43
1、异常不能跨线程传播
class ExceptionThread implements Runnable {@Overridepublic void run(){//这里只能抛运行时异常,Runnable.run不允许抛出未处理的非运行时异常throw new RuntimeException("exception in new thread");}}public class MultiThreadTest {public static void main(String[] args) throws InterruptedException {ExecutorService exec = Executors.newCachedThreadPool();exec.execute(new ExceptionThread());exec.shutdown();}}上述代码会在控制打印出异常
Exception in thread "pool-1-thread-1" java.lang.RuntimeException: exception in new threadat grucee.multithread.ExceptionThread.run(MultiThreadTest.java:12)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:722)你可能会疑惑是否可以在main方法里面处理这个异常呢,下面我们来修改main方法,尝试catch这个异常
public static void main(String[] args) throws InterruptedException {try{ ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new ExceptionThread()); exec.shutdown();} catch (RuntimeException e){System.out.println("exception in main thread.");}}很遗憾,上述代码所产生的输出和前面的实例一样。
总结:我们不可以跨线程捕获异常,即使main线程创建了抛出异常的新线程。
2、未捕获异常处理
Thread.UncaughtExceptionHandler是Java SE5中的新接口,它允许你在每个Thread对象上都附着一个异常处理器。Thread.UncaughtExceptionHandler.uncaughtException()会在线程因未捕获的异常而临近死亡时调用。
class MyExecutors{/** * 设置线程池的属性,并且传入我们自己的线程工厂 */public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 120L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), threadFactory); }}/** * 创建线程的工厂,设置线程的属性 */class MyThreadFactory implements ThreadFactory{@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r);t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());return t;}}/** * 未捕获异常处理,在线程创建时设置 */class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println(t.getName() + "," + e);}}class TaskTest implements Runnable{@Overridepublic void run() {throw new RuntimeException();}}public class ThreadPoolTest { public static void main(String[] args) { ExecutorService exec = MyExecutors.newCachedThreadPool(new MyThreadFactory()); exec.execute(new TaskTest()); exec.shutdown(); }}此时,控制台会打印出Thread-0,java.lang.RuntimeException,这表示我们成功捕获了这个异常并进行了处理。
另外Thread.setDefaultUncaughtExceptionHandler可以设置默认的异常处理类,这个处理类只会在不存在线程专有的未捕获异常处理器的情况下才会被调用。
0 0
- 《Java并发》:第五节 线程异常处理
- 第五节 字符处理
- 【Struts2框架】第五节声明式异常处理-处理异常的过程
- java笔记第五节
- Java 线程异常处理
- 2014年辛星Javascript解读第五节 break continue 与异常处理
- java线程 如何处理并发
- Java基础部分第五节
- 第五节:Quzrtz 的 线程池
- Java并发学习之八——在线程中处理不受控制的异常
- java并发编程——线程异常处理\资源共享的问题\ThreadLocal
- Java Executor并发框架(十三)Executor框架线程池关于异常的处理
- java线程池异常处理
- java线程异常的处理
- Java 多线程-线程异常处理
- java基础-并发-如何捕获线程异常
- 第一章 第五节 处理流程概述
- 第五节 字符串处理与字符串函数
- IOS开发之UINavigationController详解
- C++面向对象的基本原则
- sicily 1321.Robot
- NYOJ-289 苹果 TLE
- Java压缩目录的简单实现
- 《Java并发》:第五节 线程异常处理
- uva 669 - Defragment(dfs)
- smarty 大于等于……符号
- 'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件
- Python 实现socket通信 (UDP)
- sz 下载服务器文件
- JAVA 科学计数法
- ios json 解析框架性能比较
- ASP.NET中页面间的传值方式和各方式的优缺点