gpt4 book ai didi

java - 在 Java 1.4 中实现超时

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:24 25 4
gpt4 key购买 nike

我不能使用 Executor 和 Future 来捕获 TimeOutException,因为它是 1.4如果方法未完成,我需要在 30 秒后超时。

//Caller class
public static void main() {

EJBMethod() // has to timeout after 30 seconds

}

//EJB method in some other class
public void EJBMethod() {

}

我正在考虑的一种方法是将此方法调用包装在一个 Runnable 中,并在方法结束后从 run() 设置一些 volatile boolean 值。然后,在调用者中,我们可以在调用该方法后 hibernate 30 秒,一旦醒来,我将检查调用者中的 boolean 值是否为 SET。如果未设置,则我们需要停止该线程。

最佳答案

在最简单的情况下,您可以使用 Thread + 任意 Runnable。

如果你想从调用者的角度阻止调用,你可以创建一个运行工作线程并使用Thread.join(long)的“服务”类。等待操作完成或在指定的超时后放弃它(特别注意正确处理 InterruptedException,以免事情变得一团糟)。

Thread.isAlive()会告诉你线程是否完成。

检索结果是一个单独的问题;我想你可以处理这个...

[编辑]

简单的示例(不要按原样在生产中使用!):

/**
* Actually needs some refactoring
* Also, did not verify for atomicity - should be redesigned
*/
public V theServiceCall(final T param) {
final MyResultBuffer<V> buffer = new MyResultBuffer<V>();
Runnable task = new Runnable() {
public void run() {
V result = ejb.process(param);
buffer.putResult(result);
}
}
Thread t = new Thread(task);
t.setDaemon(true);
t.start();
try {
t.join(TASK_TIMEOUT_MILLIS);
} catch (InterruptedException e) {
// Handle it as needed (current thread is probably asked to terminate)
}
return (t.isAlive()) ? null : buffer.getResult();
}

注意:您可以在 Runnable 中实现关闭标志而不是 Thread.setDaemon(),因为这将是更好的解决方案。

[/编辑]

关于java - 在 Java 1.4 中实现超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15247412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com