2010-05-05 7 views
7

Je veux faire une requête HTTP et obtenir la réponse comme esquissée ici:Java BufferedReader readline blocage?

URLConnection c = new URL("http://foo.com").openConnection(); 
c.setDoOutput(true); 

/* write an http request here using a new OutputStreamWriter(c.getOutputStream) */ 

BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream)); 
reader.readLine(); 

Mais ma question est, si la demande que j'envoie prend beaucoup de temps avant qu'une réponse soit reçue, ce qui se passe dans l'appel reader.readLine() ci-dessus? Ce processus restera-t-il en cours d'exécution/exécutable sur le processeur ou sera-t-il retiré du processeur et sera-t-il averti de se réveiller et de s'exécuter à nouveau lorsqu'il y aura des IO à lire?

S'il reste dans la CPU, que peut-on faire pour l'éteindre et être averti plus tard?

+6

Certaines de ces réponses ont-elles suffisamment expliqué votre question? Si oui, vous devriez probablement en marquer une comme votre réponse acceptée. Si ce n'est pas le cas, éditez simplement votre question pour épeler ce qui n'est pas encore clair. – jasonmp85

Répondre

-3

Un bon système d'exploitation aura un planificateur qui placera le processus dans un état bloqué ou similaire, et les commutateurs de tâche ne passeront pas au processus bloqué.

Par exemple, Le processus inactif dans Windows est ce qui s'exécute lorsqu'il n'y a aucun processus prêt à fonctionner (en veille, bloqué, etc.).

21

Ce que les autres ont dit est correct. La bibliothèque "old I/O" de Java dans java.io contient des appels bloquants. Mais ils n'attendent pas. Ils bloquent les E/S et le noyau les reprogrammera une fois de plus les E/S sont disponibles. Je n'étais pas totalement sûr, donc je l'ai essayé par moi-même. Prenez cette classe d'exemple:

import java.io.*; 

public class Test { 

    public static void main(String[] args) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

    String line = reader.readLine(); 
    System.out.println(line); 
    } 
} 

Et compilez-le sur la ligne de commande. Ensuite, exécutez-le, mais ne tapez rien. Le programme devrait bloquer en entrée jusqu'à ce que vous tapiez un caractère, et il ne passera pas après readline jusqu'à ce que vous tapiez enter. ps devrait être en mesure de nous dire plus de détails à propos de ce processus. Utilisez le drapeau a pour obtenir des informations plus détaillées ps:

[email protected]<computer-name>] ps a 
    PID TT STAT  TIME COMMAND 
3846 s000 S  0:00.16 -zsh 
3992 s000 S+  0:00.40 /usr/bin/java Test 

La page de manuel pour le PS dit:

état L'état est donnée par une séquence de caractères, par exemple, "RWNA". Le premier caractère indique l'état de fonctionnement du processus :

  • I Marques un processus qui est au repos (sommeil pendant plus d'environ 20 secondes).
  • R Marque un processus exécutable.
  • S Marque un processus qui dort pendant moins d'environ 20 secondes.

Et depuis que je viens de commencer le processus, S est logique. Le processus est en attente, en attente d'une planification par le système d'exploitation. En effet, si vous vérifiez top, vous remarquerez que le processus prend 0% CPU.

Alors ne vous inquiétez pas pour les performances de cet appel, il n'y a pas d'attente ou d'interrogation en cours: le système s'occupe des événements d'E/S et gère intelligemment votre processus.