使用UncaughtExceptionhandler捕获异常,并进行重启

本文详细介绍了Java中如何处理线程中的未捕获异常,包括JDK5.0之前和之后的方法,以及如何通过设置UncaughtExceptionHandler来捕获和处理这些异常,确保系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  1. Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。 
  2. JDK5.0之前,不能为单独的Thread设置UncaughtExceptionHandler,也不能指定一个默认的UncaughtExceptionHandler。为了可以设置一个UncaughtExceptionHandler,需要去继承ThreadGroup并覆写uncaughtException方法。 
  3. 在JDK5.0中,我们通过Thread的实例方法setUncaughtExceptionHandler,可以为任何一个Thread设置一个UncaughtExceptionHandler。当然你也可以为所有Thread设置一个默认的UncaughtExceptionHandler,通过调用Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法,这是Thread的一个static方法。 
  4. 定义一个Handler类必须实现Thread.UncaughtExceptionHandler接口的void uncaughtException(Thread t, Throwable e)方法。如果不设置一个Handler,那么单个Thread的Handler是null。但是,如果这个单个线程是ThreadGroup中的一个Thread,那么这个线程将使用ThreadGroup的UncaughtExceptionHandler。ThreadGroup自身已经实现了Thread.UncaughtExceptionHandler接口。 
  5. uncaughtException(Thread a, Throwable e)可以拿到Thread,所以在uncaughtException释放相关资源是最好的办法。
  6. 总之,JDK5.0中Thread及其相关的辅助功能得到了加强,为我们提供了很多便利和安全的解决方案

 

	        final innerQuoteKLine inner = new innerQuoteKLine();
			final outQuoteKLine    out  = new outQuoteKLine();
			Thread t = new Thread(inner);
			Thread o = new Thread(out);

			//用于捕获未捕获的异常,出现异常后,进行重启
	   Thread.UncaughtExceptionHandler innerExceptionHandler = new Thread.UncaughtExceptionHandler() {
				@Override
				public void uncaughtException(Thread t, Throwable e) {
					logger.info("======重启线程=====");
					Thread t1 = new Thread(inner);
					t1.setUncaughtExceptionHandler(this);
					t1.start();
				}
		};
		t.setUncaughtExceptionHandler(innerExceptionHandler);
		t.start();

			//用于捕获未捕获的异常,出现异常后,进行重启
		Thread.UncaughtExceptionHandler outExceptionHandler = new Thread.UncaughtExceptionHandler() {
			@Override
			public void uncaughtException(Thread t, Throwable e) {
				   logger.info("======重启线程=====");
					Thread o1 = new Thread(out);
					o1.setUncaughtExceptionHandler(this);
					o1.start();
			}
		};
		o.setUncaughtExceptionHandler(outExceptionHandler);
		o.start();

		} catch (Exception e) {
			logger.error("行情服务端启动异常", e);
			e.printStackTrace();
		}

	}

	private static class innerQuoteKLine implements Runnable{

		@Override
		public void run() {
			    ...写你的业务..
		}

	}

	private static class outQuoteKLine  implements Runnable{

		@Override
		public void run() {

				...写你的业务..
			}
		}

 

转载于:https://my.oschina.net/percylee/blog/1510272

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值