Как я заставляю FutureTask возвращаться после TimeoutException?

Они могут быть полезны для поблочного тестирования так, чтобы при записи тестов Вы знали, что ожидать, что функция бросит, когда это перестало работать, но нет никакого осуществления, окружающего их в компиляторе. Я думаю, что они - дополнительный код, который не необходим в C++. То, которое когда-либо Вы выбираете все, в котором необходимо быть уверены, - то, что Вы следуете тому же стандарту кодирования через проект и членов команды так, чтобы Ваш код остался читаемым.

9
задан deltanovember 15 August 2009 в 05:29
поделиться

3 ответа

Вам нужно отменить задачу по истечении времени ожидания (и прервать ее поток). Для этого предназначен метод cancel (true) . :

private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool();

private static <T> T timedCall(FutureTask<T> task, long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
    THREAD_POOL.execute(task);
    return task.get(timeout, timeUnit);
}


public static void main(String[] args) {
        try {
            FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
                public Integer call() throws Exception {
                        for (int i=0; i < 1000000; i++) {
                                if (Thread.interrupted()) return 1;
                                System.out.println(new java.util.Date());
                                Thread.sleep(1000);
                        }
                        return 0;
                }
            });
            int returnCode = timedCall(task, 100, TimeUnit.SECONDS);
        } catch (Exception e) {
                e.printStackTrace();
                task.cancel(true);
        }
        return;
}
10
ответ дан 4 December 2019 в 13:03
поделиться

Ваш вызываемый объект должен иметь возможность быстро останавливаться, когда это необходимо.

Ваш код:

public Integer call() throws Exception {
    for (int i=0; i < 1000000 && !task.cancelled(); i++) {
        System.out.println(new java.util.Date());
        Thread.sleep(1000); // throws InterruptedException when thread is interrupted
    }
    return 0;
}

Уже способен сделать это благодаря вызову Thread.sleep () . Дело в том, что futureTask.cancel (true) прерывает другой поток, и ваш код должен реагировать на это прерывание. Thread.sleep () делает это. Если вы не использовали Thread.sleep () или другой прерываемый блокирующий код, вам придется самостоятельно проверить Thread.currentThread (). IsInterrupted () и выйти сразу же насколько это возможно (например, бросив new InterruptedException () ), когда вы обнаружите, что это правда.

Вам необходимо вызвать futureTask.cancel (true); из обработчика исключения, чтобы отменить и прервать поток, выполняющий вашу задачу.

4
ответ дан 4 December 2019 в 13:03
поделиться

Как только вы поймали исключение TimeoutException, вам нужно вызвать метод cancel (true) вашей задачи ...

или выключить ExecutorService, вызвав shutdownNow () ...

или закройте виртуальную машину, вызвав System.exit (0)

, в зависимости от ваших потребностей

2
ответ дан 4 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: