2010-05-05 20 views
7

Quiero hacer una petición HTTP y luego obtener la respuesta no es esbozado aquí:Java BufferedReader readline blocking?

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

Pero mi pregunta es, si la solicitud de envío tarda mucho tiempo antes de que se reciba una respuesta, lo que sucede en la llamada reader.readLine() arriba? ¿Se mantendrá este proceso funcionando/ejecutable en la CPU o se lo sacarán de la CPU y se le notificará que se active y se ejecute nuevamente cuando haya IO para leer?

Si permanece en la CPU, ¿qué se puede hacer para que se desconecte y se notifique más tarde?

+6

¿Alguna de estas respuestas explica suficientemente su pregunta? Si es así, probablemente debería marcar uno como su respuesta aceptada. Si no, solo edita tu pregunta para deletrear lo que aún no está claro. – jasonmp85

Respuesta

-3

Un buen sistema operativo tendrá un programador que coloca el proceso en un estado bloqueado o similar, y los conmutadores de tareas no cambiarán al proceso bloqueado.

Por ejemplo, El proceso inactivo en Windows es lo que se ejecuta cuando no hay procesos listos para ejecutarse (inactivo, bloqueado, etc.).

21

Lo que han dicho los demás es correcto. La biblioteca "vieja E/S" de Java en java.io contiene llamadas de bloqueo. Pero ellos no están ocupados esperando. Están bloqueando en E/S y el kernel los reprogramará una vez más E/S está disponible.

No estaba del todo seguro, así que lo probé por mi cuenta. Tome esta clase de ejemplo:

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

Y compílelo en la línea de comando. Entonces ejecútelo, pero no escriba nada. El programa debe estar bloqueando la entrada hasta que escriba un carácter, y no avanzará más allá de la línea de lectura hasta que escriba enter. ps debería poder decirnos más detalles sobre este proceso. Usar la bandera a para obtener información más detallada de 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 página del manual para PS dice:

estado El estado está dada por una secuencia de caracteres , por ejemplo, `` RWNA ''. El primer carácter indica el estado de ejecución del proceso :

  • I marcas de un proceso que está en reposo (dormir durante más de aproximadamente 20 segundos).
  • R Marca un proceso ejecutable.
  • S Marca un proceso que está durmiendo durante menos de aproximadamente 20 segundos.

Y como acabo de comenzar el proceso, S tiene sentido. El proceso está durmiendo, esperando la programación del sistema operativo. De hecho, si marca top, notará que el proceso está tomando 0% de CPU.

Así que no se preocupe por el rendimiento de esta llamada, no hay espera ocupada ni sondeos: el sistema se está ocupando de los eventos de E/S por usted y manejará de forma inteligente su proceso.