6
votes

Java: Comment s'assurer qu'une méthode d'interface ne prend pas plus de temps que x?

J'ai une méthode d'interface booleenne droite () , si ce n'est pas "répondant" dans une seconde, il devrait renvoyer false.


0 commentaires

4 Réponses :


1
votes

pas possible. C'est un comportement spécifique à la mise en œuvre.


1 commentaires

Depuis que vous avez commenté d'autres réponses qui tentent de proposer une solution, j'aimerais simplement souligner que, tout en correct, cette réponse n'est pas tout aussi utile. Vous ne pouvez pas définir tout comportement réel dans l'interface . Vous ne pouvez même pas garantir que ce sera jamais terminer. Même si elle se termine, vous ne pouvez pas vous garantir que cela vous donnera ce que vous voulez. Naturellement, vous ne pouvez pas assurer le comportement que l'OP a demandé. Peut-être avec un vérificateur statique basé sur des spécifications plus riche, vous pouvez essayer de faire en sorte qu'une implémentation suit un certain comportement, mais cela ne fait pas partie de Java standard.



3
votes

Eh bien, vous ne pouvez pas mettre cette exigence dans l'interface elle-même, mais si vous contrôlez le côté appel possible, il est possible:

  • apparaît un nouveau fil, dans lequel vous exécutez l'appel de méthode.
  • Dans le fil d'origine, rejoignez le nouveau fil avec une heure sur 1000 millisecondes.
  • Si la JOINT TIME est sortie, tuez le fil (ou ignorez-le) et retournez FAUX, sinon renvoyez le résultat de l'appel.

0 commentaires

4
votes

Oui, c'est possible avec ex. java.util.concurrent.future (interface pour représenter le résultat d'un calcul asynchrone de type V ), combiné à la méthode Obtenez (Timeout long, unité TimeUnit) . La méthode peut lancer timeoutException , entre autres exceptions, mais renvoie sinon le résultat calculé sur l'exécution normale.

Dans ce cas, vous voulez un futur , avec obtenez (1, timeunit.seconds) dans un TRY-CATCH bloc , manutention timeoutException par votre spécification.

Disponible des implémentations en béton sont FutueTask et swingworker . Si cela se trouve dans le contexte de l'application Swing, vous voudrez utiliser ce dernier.

Voir aussi


2 commentaires

En réalité, ce n'est pas une réponse à la question. Il a demandé si l'interface elle-même peut fournir ce comportement qui n'est pas possible. Mais votre suggestion est une solution possible de.


Bien que ce ne soit peut-être pas une réponse à ma question, cela aide beaucoup, tylar ty de la réponse honnête ^^



3
votes

bien sûr, il n'est pas possible d'ajouter ceci comme une vérification statique (à l'heure de la compilée, quelque chose que le compilateur peut vérifier pour y garantir), car combien de temps il faut pour exécuter une opération fortement dépend de l'environnement d'exécution que le programme est important. Courir dans.

Vous pouvez utiliser les classes dans java.util.concurrent pour exécuter une opération et attendre qu'il soit terminé dans un certain délai d'attente. Un exemple simple (non soigneusement testé, mais démontre l'idée): xxx


2 commentaires

Pas une vraie réponse à la question puisqu'il a demandé si l'interace elle-même peut fournir ce comportement. Mais est une solution possible pour le problème cependant.


@Sylar dans la première phrase que j'ai répondu à la question: la réponse est non.