Java BufferedReader readline blocage?
Je veux faire une requête HTTP et puis obtenir la réponse que esquissé ici:
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 j'envoie prend un long moment avant qu'une réponse est reçue, ce qui se passe dans l'appel lecteur.readLine() ci-dessus? Ce processus fera rester en cours d'exécution/praticable sur le CPU ou s'il s'en pris au large de la CPU et notifié à se réveiller et exécuter à nouveau lorsqu'il est IO être lu?
Si elle reste sur le CPU, ce qui peut être fait pour le faire descendre et être informé plus tard?
Avez-vous eu des réponses suffisamment expliquer votre question? Si oui, vous devriez sans doute une marque que votre réponse. Si non, il suffit de modifier une question à sort ce qui est encore incertaine.
OriginalL'auteur tgguy | 2010-05-05
Vous devez vous connecter pour publier un commentaire.
Ce que les autres ont dit, c'est correct. Java est "old I/O" de la bibliothèque en java.io contient de blocage des appels. Mais ils ne sont pas en train d'attendre. Ils bloquent sur les I/O et le noyau qui permettra de la modifier une fois de plus I/O sont disponibles.
Je n'étais pas totalement sûr, alors j'ai essayé par moi-même. Prenons cet exemple de classe:
Et de les compiler en ligne de commande. Puis l'exécuter, mais ne tapez rien. Le programme devrait être de blocage sur entrée jusqu'à ce que vous tapez un caractère, et il ne progressera pas passé readline jusqu'à ce que vous tapez.
ps
devrait être en mesure de nous en dire plus de détails sur ce processus. Utiliser lea
drapeau pour obtenir des informations plus détaillées à partir deps
:La page de man pour le PS dit:
Et puisque je viens de commencer le processus, S de sens. Le processus est endormi, dans l'attente de la planification par l'OS. En effet, si vous cochez
top
, vous remarquerez que le processus est 0% de CPU.Donc ne vous inquiétez pas au sujet de la performance de cet appel, il n'y a pas occupé d'attente ou d'interrogation: le système est en prenant soin de les I/O des événements pour vous et une gestion intelligente de votre processus.
OriginalL'auteur jasonmp85
Un bon OS sera un planificateur qui met le processus en une ou bloqué le même état, et toutes les tâches de commutation pas à passer le processus bloqué.
Par exemple,
Le processus inactif dans windows s'exécute lorsqu'il n'existe pas de processus prêts à exécuter (sommeil, bloqué, etc.).
OriginalL'auteur LM.