Dans le code ci-dessous, j'attrape une exception TimeoutException après 100 secondes comme prévu. À ce stade, je m'attendrais à ce que le code sorte de main et que le programme se termine, mais il continue d'imprimer sur la console. Comment puis-je arrêter la tâche après l'expiration du délai?Comment obtenir FutureTask pour retourner après 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() devrait être! IsCancelled() car djna a écrit à l'origine – Zed
Je pense qu'il est préférable d'utiliser des interruptions. Tout d'abord, votre code appelable n'a pas besoin de connaître la 'tâche 'du tout. Deuxièmement, lorsque vous utilisez diverses opérations de blocage dans votre code appelable (comme 'Thread.sleep()'), elles ne réagissent pas à task.isCancelled(), mais réagissent généralement aux interruptions. Utiliser 'cancel (true)' et informer votre code des interruptions est généralement le meilleur moyen de le faire. (Votre code sera aussi plus général, car le mécanisme d'interruption est si largement utilisé dans Java) –
Je suppose que mon point est que "l'interruption est un mécanisme coopératif". (http://www.ibm.com/developerworks/java/library/j-jtp05236.html) –