java - móviles - manual de programacion android pdf
¿Un tiempo de espera futuro mata la ejecución del hilo? (3)
Cuando Runnable
un ExecutorService
y objetos Future
(al enviar tareas Runnable
), si especifico un valor de tiempo de espera para la función get del futuro, ¿se TimeoutException
el hilo subyacente cuando se lanza una TimeoutException
?
No es asi. ¿Por qué lo haría? A menos que usted lo diga.
Aquí hay una preocupación muy válida en caso de un Llamado, por ejemplo. Si esperaste el resultado por digamos 20 segundos y no lo obtuviste, entonces ya no estás interesado en el resultado. En ese momento debe cancelar la tarea en absoluto.
Algo como esto:
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
No, no. Además, ni siquiera hay intento de interrumpir la tarea. En primer lugar Future.get con tiempo de espera no lo dice. En segundo lugar, prueba mi prueba para ver cómo se comporta
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished");
}
});
f.get(1, TimeUnit.SECONDS);
en 1 segundo imprime
Exception in thread "main" java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
at java.util.concurrent.FutureTask.get(FutureTask.java:91)
at Test1.main(Test1.java:23)
después de otro 1 segundo, la tarea termina exitosamente
finished
Parece que necesita matar, cancelar o cerrar la tarea explícitamente
Manejo de excepciones de las tareas de Java ExecutorService
¿Cómo consigo que FutureTask regrese después de TimeoutException?