Java方法的执行超时策略

时间:2014-01-09 02:21:22

标签: java

我有一个为大量交易提供服务的系统。 超时策略仅适用于事务的一部分。

此处的完整交易包括一些执行工作流程,预处理,远程调用,后处理等。

例如,

  

//一些代码

     

// START TIMER

     

试   {

     
    

CallInput remoteInput = fInputProcessor.transform(callContext);

         

CallOutput remoteOutput = fRemoteInvoker.invoke(remoteInput);

         

TransactionOutput输出= fOutputProcessor.transform(remoteOutput);

  
     

}

     

catch(TimeoutException ex)   {

     

}

     

//一些代码

假设超时为500毫秒。它可能在输入处理,远程调用或输出处理期间发生。

你能列出一些在500ms后产生超时的方法吗?假设我无法将3个块拆分为新线程。

3 个答案:

答案 0 :(得分:1)

您可以使用Guava并使用以下代码:

TimeLimiter limiter = new SimpleTimeLimiter();
limiter.callWithTimeout(new Callable<Void>() {
    public Void call() {
          CallInput remoteInput = fInputProcessor.transform(callContext);
          CallOutput remoteOutput = fRemoteInvoker.invoke(remoteInput);
          TransactionOutput output = fOutputProcessor.transform(remoteOutput);
    }
  }, 500, TimeUnit.MILISECONDS, false);

答案 1 :(得分:1)

考虑使用java.util.concurrent.Future.get(long, TimeUnit)

Runnable yourTask = <wrap your work code in a Runnable>;
Future future = threadpool.submit(yourTask);
try {
    Object result = future.get(10, TimeUnit.SECONDS);
} catch (Exception e) {
    <handle exception, e.g. TimeoutException>
} finally {
    <your closing code>
}

以下是创建/销毁线程池的示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

private ExecutorService threadpool;

public void start() {
    threadpool = Executors.newCachedThreadPool();
}

public void stop() throws InterruptedException {
    threadpool.shutdown();
    if (false == threadpool.awaitTermination(1, TimeUnit.SECONDS))
        threadpool.shutdownNow();
}

答案 2 :(得分:0)

DelayQueues(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/DelayQueue.html)也很有用。您可以向实现Delayed接口的队列添加元素,该接口用于定义Delayed对象的到期时间。然后,您可以轮询队列中已过期的元素并使用它们执行某些操作

while (!Thread.currentThread().isInterrupted()) {
     doSomethingWithExpiredObj();
}