Исходя из вашего вопроса, который я собираю, вы хотите, чтобы код ожидал определенное количество времени и времени ожидания, если выполнение не было завершено до этого момента?
Если вы хотите сделать это, ядумаю, что лучший способ - реализовать простой класс, который использует исполнителя для ожидания результата. Исполнители поддерживают тайм-ауты и могут возвращать значение ИЛИ выдавать исключение, если выполнение занимает слишком много времени.
Для этого я написал следующий простой класс:
public class TimedWait<T> {
public T run(Callable<T> run, long timeoutMs) throws TimeoutException, ExecutionException, InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
return executor.invokeAny(Collections.singletonList(run), timeoutMs, TimeUnit.MILLISECONDS);
}
}
Это будет использовать упомянутое мной время ожиданияи запустит предоставленный Callable с указанным тайм-аутом, после которого будет сгенерировано исключение.
Ниже приведен пример того, как он может функционировать (я сделал быструю и грязную обработку исключений в качестве примера, вы могли быхочу немного убрать это, чтобы избежать попытки перехвата catch)
public void run() {
try {
String result = new TimedWait<String>().run(() -> {
Thread.sleep(500);
return "Some Result";
}, 1000L);
System.out.println(result);
String timeOut = new TimedWait<String>().run(() -> {
Thread.sleep(1500);
return "This will time out";
}, 1000L);
System.out.println(timeOut);
} catch (Exception e) {
e.printStackTrace();
}
}
Так как в этом примере задержка для первого вывода меньше, чем время ожидания, результат будет напечатан. Для второго выхода задержка превышает время ожидания, что приводит к исключению.
Вывод:
Some Result
java.util.concurrent.TimeoutException