Они могут быть полезны для поблочного тестирования так, чтобы при записи тестов Вы знали, что ожидать, что функция бросит, когда это перестало работать, но нет никакого осуществления, окружающего их в компиляторе. Я думаю, что они - дополнительный код, который не необходим в C++. То, которое когда-либо Вы выбираете все, в котором необходимо быть уверены, - то, что Вы следуете тому же стандарту кодирования через проект и членов команды так, чтобы Ваш код остался читаемым.
Вам нужно отменить задачу по истечении времени ожидания (и прервать ее поток). Для этого предназначен метод 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;
}
Ваш вызываемый объект должен иметь возможность быстро останавливаться, когда это необходимо.
Ваш код:
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);
из обработчика исключения, чтобы отменить и прервать поток, выполняющий вашу задачу.
Как только вы поймали исключение TimeoutException, вам нужно вызвать метод cancel (true) вашей задачи ...
или выключить ExecutorService, вызвав shutdownNow () ...
или закройте виртуальную машину, вызвав System.exit (0)
, в зависимости от ваших потребностей