Java:如何确保接口方法不比X花费更多时间?

时间:2010-08-05 07:21:32

标签: java interface

我有一个接口方法boolean right(),如果它在一秒内没有“回答”,它应该返回false。

4 个答案:

答案 0 :(得分:4)

是的,这可以用例如java.util.concurrent.Future<V>(标准interface表示类型V的异步计算的结果),并与方法get(long timeout, TimeUnit unit)结合使用。除了其他异常之外,该方法可以抛出TimeoutException,但在正常执行时返回计算结果。

在这种情况下,您需要一个Future<Boolean>get(1, TimeUnit.SECONDS)块中的try-catch,根据您的规范处理TimeOutException

可用的具体实现是FutureTask<V>SwingWorker<T,V>。如果这是在Swing应用程序的上下文中,那么你想要使用后者。

另见

答案 1 :(得分:3)

嗯,你不能把这个要求放在界面本身,但是如果你控制主叫方那就可能:

  • 生成一个新线程,您可以在其中执行方法调用。
  • 在原始线程中,使用新线程加入1000毫秒的超时时间。
  • 如果加入超时,则终止线程(或忽略它的结果),并返回false,否则返回调用结果。

答案 2 :(得分:3)

当然,不可能将其添加为静态检查(在编译时,编译器可以检查以确保它),因为运行操作需要多长时间取决于程序所在的运行时环境跑进来。

您可以使用java.util.concurrent中的类来运行操作并等待它在特定超时内完成。一个简单的例子(没有经过全面测试,但证明了这个想法):

ExecutorService exec = Executors.newSingleThreadExecutor();
Future<Integer> future = exec.submit(new Callable<Integer>() {

    @Override
    public Integer call() throws Exception {
        Thread.sleep(10000);
        return 123;
    }
});

try {
    // Run the callable, wait for max. 5 seconds
    System.out.println(future.get(5, TimeUnit.SECONDS));
}
catch (TimeoutException ex) {
    System.out.println("The operation took too long!");
}

答案 3 :(得分:1)

不可能。这是特定于实现的行为。