2009-10-09 7 views
3
private String indexPage(URL currentPage) throws IOException { 
    String content = ""; 
    is = currentPage.openStream(); 
    content = new Scanner(is).useDelimiter("\\Z").next(); 
    return content; 
} 

C'est ma fonction avec laquelle je suis actuellement en train d'explorer des pages Web. La fonction d'un problème est:Comment faire une fonction "timeoutable" en Java?

content = new Scanner(is).useDelimiter("\\Z").next(); 

Si la page Web ne répond pas ou prend beaucoup de temps pour répondre, mon fils se bloque juste à la ligne ci-dessus. Quel est le moyen le plus simple d'annuler cette fonction, s'il faut plus de 5 secondes pour charger complètement ce flux?

Merci d'avance!

+0

+1 pour l'utilisation de « timeoutable » Habituellement – Davie

Répondre

7

Au lieu de lutter avec un fil de veilleur séparé, il pourrait être suffisant pour vous (mais pas exactement une réponse à vos besoins) si vous activez la connexion et lire les délais d'attente sur le connexion réseau, par exemple:

URL url = new URL("..."); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setConnectTimeout(5000); 
conn.setReadTimeout(10000); 
InputStream is = conn.getInputStream(); 

Cet exemple échouera si cela prend plus de 5 secondes (5000ms) pour se connecter au serveur ou si vous devez attendre plus de 10 secondes (10000ms) entre les morceaux de contenu qui sont lire réellement. Il ne limite cependant pas le total temps dont vous avez besoin pour récupérer la page.

+0

merci, c'était exactement ce que je cherchais! – ndee

3

Vous pouvez fermer le flux à partir d'un autre thread.

0

Essayez d'interrompre le filetage; de nombreux appels bloquants en Java continueront lorsqu'ils recevront une interruption.

Dans ce cas, content doit être vide et Thread.isInterrupted() doit être true.

+0

Les E/S ne sont pas interruptibles comme ça. Certaines versions de Sun JRE sous Solaris le faisaient, mais je ne connais pas d'autres versions qui l'activent par défaut. –

3

Google a récemment publié guava-libraries ont certaines classes qui offrent des fonctionnalités similaires:

TimeLimiter:

produit des procurations qui imposent une limite de temps sur les appels de méthode à l'objet approximé. Par exemple, pour renvoyer la valeur de target.someMethod(), mais DEFAULT_VALUE remplacement si cet appel de méthode prend plus de 50 ms, vous pouvez utiliser ce code ...

Questions connexes