Nel codice qui sotto, sto prendendo un TimeoutException dopo 100 secondi come previsto. A questo punto mi aspetto che il codice esca dal programma principale e che il programma termini, ma continua a stampare sulla console. Come faccio a interrompere l'esecuzione dell'attività dopo il timeout?Come posso restituire FutureTask dopo TimeoutException?
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() dovrebbe essere! IsCancelled() come djna originariamente scritto – Zed
penso che sia molto meglio usare interruzioni. Innanzitutto, il tuo codice callable non ha bisogno di sapere nulla su 'task'. Secondo, quando usi varie operazioni di blocco nel tuo codice callable (come 'Thread.sleep()'), queste non reagiranno a task.isCancelled(), ma di solito reagiscono alle interruzioni. Quindi usare 'cancel (true)' e rendere il tuo codice consapevole delle interruzioni è di solito il modo migliore per farlo. (Il tuo codice sarà anche più generale, perché il meccanismo delle interruzioni è così ampiamente usato in Java) –
Credo che il mio punto sia che "L'interruzione è un meccanismo cooperativo". (http://www.ibm.com/developerworks/java/library/j-jtp05236.html) –