Как я могу установить тайм-аут вокруг некоторого кода в Java в основном потоке? - PullRequest
7 голосов
/ 04 мая 2009

Я ищу функциональность в Java, идентичную этой в ruby:

SystemTimer.timeout_after (30.секунд) сделать сделай что-нибудь конец

Я мог бы добиться этого, разветвив поток, а затем убив его через некоторое время, но есть ли более простой способ?

Ответы [ 4 ]

2 голосов
/ 04 мая 2009

Не можете ли вы просто использовать Java Таймер ?

Возможность для потоков планировать задачи для будущего выполнения в фоновом потоке. Задачи могут быть запланированы для одноразового выполнения или для повторного выполнения с регулярными интервалами.

0 голосов
/ 28 ноября 2016

То, что вы ищете, это CompletableFuture<T> (ссылка ведет на официальный JavaDoc) из Java 8.

Использование может выглядеть примерно так:

public static <V> Optional<V> of(PrivilegedAction<V> action, Duration duration) {

    final CompletableFuture<V> handler = CompletableFuture.supplyAsync(() -> action.run());
    V retval = null;
    try {
        retval = handler.get(duration.toMillis(), TimeUnit.MILLISECONDS);
    } catch (TimeoutException te) {
    } catch (Exception e) {
        try {
            handler.cancel(true);
        } catch (CancellationException ce) {
        }
    }
    return Optional.ofNullable(retval);
}

Созданный мной утилитарный класс: (комментарии на немецком языке) DTimeout (Посмотреть на pastebin)

0 голосов
/ 04 мая 2009

Вы можете создать ThreadPoolExecutor , который имеет метод invokeAll , который получает тайм-аут в качестве параметра.

0 голосов
/ 04 мая 2009

Либо запустите его в потоке, либо сделайте что-то вроде этого:

void method() {
    long endTimeMillis = System.currentTimeMillis() + 10000;
    while (true) {
        // method logic
        if (System.currentTimeMillis() > endTimeMillis) {
            // do some clean-up
            return;
        }
    }
}

Как видите, это не работает для всех видов методов.

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