Limit Java Method Execution Time

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-aspectsAspectJ实现此目的的方法:

请记住,在编译后应该对类进行编织,可以在这里找到更详细的解释。

让我们讨论一下实际的工作原理,但是首先,我建议您阅读这篇文章,其中解释了AOP方面如何与Java注解一起使用。

由于@Timeable注解和类编织,对load()方法的每次调用都会被jcabi-aspects中的一个方面拦截。该方面会启动一个新线程,每秒监视方法的执行情况,检查它是否仍在运行。

如果方法运行超过五秒钟,该线程会对该方法的线程调用interrupt()

尽管很常见的期望是在调用时立即终止线程,但实际上并没有发生。这篇文章对这个机制进行了更详细的解释。让我们简要讨论一下。

  1. 线程尽可能频繁地检查interrupted()

  2. 如果标记被设置,线程将停止并抛出 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

sixnines availability badge   GitHub stars