2010-05-05 11 views
7

Voglio fare una richiesta HTTP e quindi ottenere la risposta come abbozzato qui:Blocco lettura Java BufferedReader?

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(); 

Ma la mia domanda è, se la richiesta di invio richiede molto tempo prima che si riceve una risposta, che cosa succede nella chiamata reader.readLine() sopra? Questo processo rimarrà in esecuzione/eseguibile sulla CPU o verrà rimosso dalla CPU e verrà notificato per essere riattivato e riavviato quando c'è IO da leggere?

Se rimane nella CPU, cosa si può fare per farlo scendere e ricevere una notifica in seguito?

+6

Qualcuno di queste risposte ha sufficientemente spiegato la tua domanda? Se è così, dovresti probabilmente contrassegnarne uno come risposta accettata. In caso contrario, modifica la tua domanda per spiegare cosa non è ancora chiaro. – jasonmp85

risposta

-3

Un buon sistema operativo dispone di un programmatore che mette il processo in uno stato bloccato o simile, e qualsiasi commutatore di attività non passerà al processo bloccato.

Ad esempio, Il processo di inattività in Windows è ciò che viene eseguito quando non ci sono processi pronti per l'esecuzione (inattivo, bloccato, ecc.).

21

Ciò che gli altri hanno detto è corretto. La libreria "old I/O" di Java in java.io contiene le chiamate di blocco. Ma non sono molto occupati ad aspettare. Stanno bloccando l'I/O e il kernel ripianificherà l'I/O ancora una volta.

Non ne ero totalmente sicuro, quindi l'ho provato per me stesso. Prendi questa classe di esempio:

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); 
    } 
} 

E compilarlo sulla riga di comando. Quindi eseguilo, ma non digitare nulla. Il programma dovrebbe bloccare l'input fino a quando non si digita un carattere, e non avanzerà oltre la readline finché non si digita enter. ps dovrebbe essere in grado di dirci maggiori dettagli su questo processo. Utilizzare il flag a per ottenere informazioni più dettagliate da 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 pagina man per PS dice:

stato Lo stato è dato da una sequenza di caratteri , per esempio, `` RWNA ''. Il primo carattere indica lo stato di esecuzione del processo :

  • I Marks un processo che è inattivo (sonno per più di circa 20 secondi).
  • R Contrassegna un processo eseguibile.
  • S Contrassegna un processo che sta dormendo per meno di circa 20 secondi.

E dato che ho appena iniziato il processo, S ha un senso. Il processo sta dormendo, in attesa della pianificazione da parte del sistema operativo. In effetti, se controlli top, noterai che il processo sta prendendo il 0% di CPU.

Quindi non preoccuparti delle prestazioni di questa chiamata, non ci sono attese o polling in corso: il sistema si prende cura degli eventi I/O per te e gestirà in modo intelligente il tuo processo.