在Java 1.4中实现超时

时间:2013-03-06 12:29:34

标签: java multithreading

我不能使用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布尔值。然后,在调用者中,我们可以在调用该方法后休眠30秒,一旦醒来,我将检查调用者中的布尔值是否为SET。如果没有设置,那么我们需要停止该线程。

1 个答案:

答案 0 :(得分:2)

在最简单的情况下,您可以使用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(),因为它是一个更好的解决方案。

[/编辑]