101 votes

Comment appeler une méthode de blocage avec un délai d'expiration en Java?

Existe-t-il un moyen simple d'appeler une méthode de blocage avec un délai d'attente en Java? Je veux pouvoir faire:

 // call something.blockingMethod();
// if it hasn't come back within 2 seconds, forget it
 

si ça a du sens.

Merci.

160voto

skaffman Points 197885

Vous pouvez utiliser un exécuteur:

 ExecutorService executor = Executors.newCachedThreadPool();
Callable<Object> task = new Callable<Object>() {
   public Object call() {
      return something.blockingMethod();
   }
};
Future<Object> future = executor.submit(task);
try {
   Object result = future.get(5, TimeUnit.SECONDS); 
} catch (TimeoutException ex) {
   // handle the timeout
} catch (InterruptedException e) {
   // handle the interrupts
} catch (ExecutionException e) {
   // handle other exceptions
} finally {
   future.cancel(); // may or may not desire this
}
 

Si le fichier future.get ne revient pas dans les 5 secondes, il lève une exception. Voir javadoc pour plus de détails.

9voto

gommo Points 697

Vous pouvez envelopper l'appel dans un FutureTask et utiliser la version de timeout de get ().

Voir http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/FutureTask.html.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X