The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
假设您想要使一个Java方法在最多五秒内工作,并在超过时间限制时抛出异常。以下是使用jcabi-aspects和AspectJ实现此目的的方法:
请记住,在编译后应该对类进行编织,可以在这里找到更详细的解释。
让我们讨论一下实际的工作原理,但是首先,我建议您阅读这篇文章,其中解释了AOP方面如何与Java注解一起使用。
由于@Timeable
注解和类编织,对load()
方法的每次调用都会被jcabi-aspects中的一个方面拦截。该方面会启动一个新线程,每秒监视方法的执行情况,检查它是否仍在运行。
如果方法运行超过五秒钟,该线程会对该方法的线程调用interrupt()
。
尽管很常见的期望是在调用时立即终止线程,但实际上并没有发生。这篇文章对这个机制进行了更详细的解释。让我们简要讨论一下。
线程尽可能频繁地检查
interrupted()
。如果标记被设置,线程将停止并抛出
InterruptedException
。
这种方法不会对interrupt()
调用作出反应,并且会一直运行,直到JVM被终止(非常糟糕的设计)。
这就是我们应该如何重构它,以使其对中断请求变得敏感。
换句话说,你的方法只能停止自己。其他什么都不能做到。运行它的线程不会被另一个线程终止。其他线程能做的最好的事情是给你的线程发送一个“消息”(通过interrupt()
方法),告诉它是时候停止了。如果你的线程忽略了这个消息,没人能做什么。
JDK中的大部分I/O操作都是这样设计的。它们在等待I/O资源时会检查线程的中断状态。
因此,使用@Timeable
注解,但要记住可能存在无法中断线程的情况。
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-05 at 21:48