Future.get (timeout) no arroja confiablemente TimeoutException después del tiempo de espera dado. ¿Es este comportamiento normal o puedo hacer algo para que esto sea más confiable? Esta prueba falla en mi máquina. Sin embargo, si duermo durante 3000 en lugar de 2000, pasará.¿Por qué Java Future.get (timeout) no es confiable?
public class FutureTimeoutTest {
@Test
public void test() throws
ExecutionException,
InterruptedException {
ExecutorService exec = Executors.newSingleThreadExecutor();
final Callable call = new Callable() {
@Override
public Object call() throws Exception {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
return 0;
}
};
final Future future = exec.submit(call);
try {
future.get(1000, TimeUnit.MILLISECONDS);
fail("expected TimeoutException");
} catch (TimeoutException ignore) {
}
}
}
interesante. Hace ¿varía según la plataforma? Podría ser un error en la JVM o el sistema operativo. – JOTN
No estoy seguro de que esto realmente cuente como un error, per se. Es probable que haya un cierto no determinismo en cuánto tiempo habrá pasado entre comenzando ese otro hilo e incluso comenzando a esperar que se complete el futuro. Sí, 1 segundo parece un poco demasiado, pero no veo nada en los documentos que en realidad ofrezca garantías duras sobre los plazos. –
Solo lo he probado Windows XP. Estoy de acuerdo en que no puede haber determinismo, sin embargo no hay h sucediendo en este ejemplo. Mi caso en el mundo real tiene múltiples hilos y hay un bloqueo dentro de JNI en las respuestas de la red. Puedo entender alguna variabilidad en el tiempo de espera en ese caso pero aquí? –