用Annotation,Future,动态代理实现自己的JAVA方法运行超时应用

本文介绍了一种使用Annotation和动态代理简化Java方法超时处理的方法。通过在方法上添加@Timeout注解,配合动态代理和Future接口,可以在方法执行超过指定时间时抛出超时异常。示例代码包括@Timeout注解、TimeoutBean、TimeoutFactory、TimeoutHandler等类的设计和实现,以及测试用例。

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

 设置一个方法的执行超时,通常用守护线程或FUTURE接口来实现,但是每次要写一堆来实现,这里用Annotation和动态代理来实现,简化开发。

 

设计原则:将需要超时的方法标记为@Timeout("5000"),表示该方法执行超过5000MS时,将抛出超时异常。

在系统加载类时,通过指定package或目录扫描类,找出有@Timeout标记的方法,将其类动态代理。在调用该方法时通过代理类来执行达到超时的效果。

 

本人一共设计了几个类,如下图:

 

 

@Timeout,关于Annotatiion的定义以及说明本文不做阐述了。

 

1.LocalTimeoutException.java

 

2.TimeoutBean,用来记录标记了@Timeout的方法以及其所属类对象

 

3.TimeoutFactory.java,用来扫描类和生成代理类

 

 

4.TimeoutHandler.java,实现Future接口(java.util.concurrent)功能,也就是超时

 

 

5.TimeoutCallable.java,Future接口所学的Callable

 

 

6.TimeoutTest.java,效果测试类与接口类

 

 

调用演示:仔细观察几个方法,你会发现其输出的结果又所不同。

如:execute()方法在超时后就不会执行后面的语句,而connect()方法即使超时后还是会执行后面的语句,并且会抛出InterruptedException,而execute()方法只会抛出LocalTimeoutException.

print()是普通方法。test()方法则不会抛出任何异常。

通常采用execute()方法这种写法就可以达到我们想要的效果了。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值