关于多线程中的异常处理

在多线程中,如果线程的执行代码中出现异常,应该怎么处理?是抛出异常还是在执行代码中直接try catch了?我想一切的一切先从下面的这个demo说起。

public class TestThread {
	public void testExecute() {

		try {
			ExecutorService executorService = Executors.newCachedThreadPool();
			executorService.execute(new ExceptionDemo());
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	public static void main(String[] args) {
		new TestThread().testExecute();
	}
}

class ExceptionDemo implements Runnable {

	@Override
	public void run() {
		int i = 1 / 0;
		System.out.println(i);
	}
}

先不执行,我们推断一下:多线程执行run方法时,会抛出runtime异常,在testExecute方法中,会将这个异常捕获到,然后做相应的处理。
现在我放到eclipse中,执行一次上面的代码,发现我想错了,异常并没有被捕捉到,而是直接抛出了,怎么回事?再仔细一想,也符合线程的设计初衷: 线程本身就是被看作独立的执行片断,每启动一个新的线程都会产生一个的线程栈,里面的任务在它新生成的线程栈里运行,跟你启动该线程的线程没有直接的关系。

 回到一开始的话题,线程的执行代码其实都是放在run方法中的:

@Override
public void run()

这样肯定是不能抛出checked异常了,也就是说所有的checked异常都必须处理掉或者转化为运行时异常再抛出。

而上面的例子又发现,抛出的异常不能被主线程捕获,我们可以为线程创建一个处理异常类Thread.UncaughtExceptionHandler 来解决,如下:

static class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{

		@Override
		public void uncaughtException(Thread t, Throwable e) {
			throw new RuntimeException(e);
		}
	}

 

 

转载于:https://my.oschina.net/xishuixixia/blog/78421

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值