2011-12-13 21 views
9

¿Conoces una forma de interrumpir una lectura de Java InputStream sin cerrar el socket asociado?¿Alguna forma de usar java.nio. * Para interrumpir un InputStream # read() sin cerrar el socket?

Aquí es la estrategia de construcción actual de agarrar un flujo de entrada zócalo y la conversión a un DataInputStream interrumpible:

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream())); 
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream); 

Esto hace uso de un ReadableByteChannel que ofrece un método read(ByteBuffer) con soporte para una throwable ClosedByInterruptException.

El problema es que llamar a una interrupción en el hilo haciendo llamadas a read() en el DataInputStream hace que se cierre el zócalo subyacente.

Para mi contexto, necesito que el socket permanezca abierto; la llamada read está esperando la entrada del usuario que no viene, entonces estoy usando la interrupción para pasar el control a un componente más alto y finalmente regresar al read nuevamente.

Estaría muy agradecido si alguien pudiera sugerir una forma de lograrlo utilizando las clases integradas de JDK, o tal vez señalando que no es posible con algo de información.

Entiendo que hay otras formas de lograr el mismo efecto, pero de todos modos tengo curiosidad por saber si este enfoque es factible.

+0

Puede usar un 'Selector' y' .select (int) 'en el socket. – fge

+1

establece un tiempo de espera de lectura en el socket. – jtahlborn

+0

@fge - Gracias. Investigué lo que sugirió y parece plausible. Entonces, si ejecuto mySelector.select() en mi hilo en lugar de read() directamente, y luego interrumpo el hilo, el socket permanecerá abierto. – KomodoDave

Respuesta

2

Si interrumpe un canal interrumpido durante una lectura, se cerrará y arrojará una ClosedByInterruptException. Si solo quieres un tiempo de espera de lectura, no uses ningún canal, solo un socket regular; llama a Socket.setSoTimeout() con un tiempo de espera de shortish y comprueba el estado isInterrupted() del hilo cada vez que se activa el tiempo de espera. Mejor aún, revise su requisito para interrumpir el hilo. ¿Para qué es eso?

+0

Muchas gracias :-) – KomodoDave

Cuestiones relacionadas