W poniższym kodzie przechwytywania TimeoutException po 100 sekund zgodnie z przeznaczeniem. W tym momencie oczekiwałbym, że kod wyjdzie z programu głównego i programu, ale zakończy drukowanie na konsoli. Jak sprawić, aby zadanie przestało działać po przekroczeniu limitu czasu?Jak ustawić funkcję FutureTask w celu powrotu po przekroczeniu limitu czasu?
private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool();
private static <T> T timedCall(Callable<T> c, long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
FutureTask<T> task = new FutureTask<T>(c);
THREAD_POOL.execute(task);
return task.get(timeout, timeUnit);
}
public static void main(String[] args) {
try {
int returnCode = timedCall(new Callable<Integer>() {
public Integer call() throws Exception {
for (int i=0; i < 1000000; i++) {
System.out.println(new java.util.Date());
Thread.sleep(1000);
}
return 0;
}
}, 100, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
! Task.cancelled() powinno być! IsCancelled() jak djna pierwotnie napisał – Zed
Myślę, że znacznie lepiej jest używać przerw. Po pierwsze, twój kod wywoływalny wcale nie musi wiedzieć o 'zadaniu'. Po drugie, jeśli używasz różnych operacji blokowania w swoim kodzie wywoływanym (jak 'Thread.sleep()'), nie będą one reagować na task.isCancelled(), ale zazwyczaj reagują na przerwy. Zatem używanie 'cancel (true)' i uświadamianie kodu o przerwach jest zwykle najlepszym sposobem na zrobienie tego. (Twój kod będzie również bardziej ogólny, ponieważ mechanizm przerw jest tak szeroko stosowany w Javie) –
Chyba moim punktem jest to, że "Przerwanie jest mechanizmem współpracy". (http://www.ibm.com/developerworks/java/library/j-jtp05236.html) –