Java: как обеспечить, чтобы метод интерфейса не занимал больше времени, чем X? - PullRequest
6 голосов
/ 05 августа 2010

У меня есть метод интерфейса логический right(), если он не «отвечает» в секунду, он должен вернуть false.

Ответы [ 4 ]

4 голосов
/ 05 августа 2010

Да, это возможно, например, 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, то вам следует использовать последнее.

Смотри также

3 голосов
/ 05 августа 2010

Конечно, невозможно добавить это как статическую проверку (во время компиляции, то, что компилятор может проверить, чтобы убедиться в этом), потому что время, необходимое для выполнения операции, сильно зависит от среды выполнения, в которой находится программа. обкатка.

Вы можете использовать классы в 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 голосов
/ 05 августа 2010

Ну, вы не можете поместить это требование в сам интерфейс, но если вы управляете вызывающей стороной, это возможно:

  • Создать новый поток, в котором вы выполняете метод-call.
  • В исходном потоке соединитесь с новым потоком с тайм-аутом в 1000 миллисекунд.
  • Если время соединения истекло, убейте поток (или проигнорируйте его результат) и вернитеfalse, в противном случае возвращает результат вызова.
1 голос
/ 05 августа 2010

Не возможно.Это поведение, зависящее от реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...