设置一个方法的执行超时,通常用守护线程或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()方法这种写法就可以达到我们想要的效果了。。。