2012-04-07 20 views

Respuesta

4

No es nada más sacarlo de la caja, no. Normalmente, el lector solo se desconecta de una llamada de lectura() cuando otro hilo cierra la secuencia subyacente, o llega al final de la entrada.

Como read() no es tan interrumpe, se convierte en un problema de programación concurrente. El hilo que sabe sobre el tiempo de espera tendrá que ser capaz de interrumpir el hilo que está tratando de leer la entrada.

Básicamente, el hilo de lectura tendrá que sondear el método Ready() del Reader, en lugar de bloquearse en read() cuando no hay nada que leer. Si ajusta esta operación de sondeo y espera en un java.util.concurrent.Future, llame al método get() de Future con un tiempo de espera excedido.

Este artículo entra en algunos detalles: http://www.javaspecialists.eu/archive/Issue153.html

12

Una forma un poco más fácil de hacer esto que la respuesta de Benjamin Cox sería hacer algo como

int x = 2; // wait 2 seconds at most 

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
long startTime = System.currentTimeMillis(); 
while ((System.currentTimeMillis() - startTime) < x * 1000 
     && !in.ready()) { 
} 

if (in.ready()) { 
    System.out.println("You entered: " + in.readLine()); 
} else { 
    System.out.println("You did not enter data"); 
} 

Esto, sin embargo consumir más recursos que su solución .

+2

BufferedReader.ready() parece devolver verdadero si hay algún byte disponible, no necesariamente incluyendo una nueva línea. Considere el caso donde hay un personaje esperando sin una línea nueva. in.ready() devuelve true, se invoca in.readLine(), pero bloquea indefinidamente esperando nueva línea. – pendor

+1

@pendor Pero el 'System.in' estándar solo dará datos si el usuario ingresa enter en la línea de comando que proporciona la secuencia de nueva línea. – Jeffrey

+1

@Jeffrey es eso documentado en cualquier lugar? – Max

Cuestiones relacionadas