Pourquoi Java Avenir.get(délai d'expiration) ne sont Pas Fiables?

Avenir.get(délai d'expiration) ne sont pas fiables jeter le TimeoutException après le délai d'attente. Est-ce un comportement normal, ou puis-je faire quelque chose pour le rendre plus fiable? Ce test échoue sur ma machine. Cependant, si je dors à 3000 au lieu de 2000, ça va passer.

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) {
    }
}

}

  • Intéressant. Varie-t-elle par la plate-forme? Il pourrait être un bug dans la JVM ou de l'OS.
  • Je ne suis pas sûr que ce serait vraiment compter comme un bug en soi. Il y a certainement des non-déterminisme dans combien de temps sera passé entre le point de départ que l'autre thread et même de commencer à attendre pour l'Avenir pour compléter. Oui, 1 seconde semble un peu beaucoup, mais je ne vois rien dans les docs qui rendent difficile les garanties sur les délais.
  • Je ne l'ai essayé sur Windows XP. Je suis d'accord qu'il pourrait être non-déterminisme, cependant il n'y a pas beaucoup qui se passe dans cet exemple. Mon cas réels a plusieurs threads et il y a blocage au sein JNI sur les réponses de réseau. Je peux comprendre une certaine variabilité dans le timeout dans ce cas, mais ici?
  • Ce JVM/JDK/IDE/TestFramework utilisez-vous? Cela fonctionne très bien dans le Soleil JDK6 + jUnit4 + Netbeans.
  • souligne qu'il pourrait être un fil de contention question: qu'advient-il si vous changez le test à exécuter dans un seul thread à l'aide d'un FutureTask?
  • Cela fonctionne très bien sur ma machine, le Soleil JDK6, Windows Server 2008 R2.