Estoy usando RXTX para leer datos de un puerto serie. La lectura se realiza dentro de un subproceso generado de la siguiente manera: ClaseLa interrupción de subproceso no finaliza la llamada de bloqueo en la secuencia de entrada lee
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(port);
CommPort comm = portIdentifier.open("Whatever", 2000);
SerialPort serial = (SerialPort)comm;
...settings
Thread t = new Thread(new SerialReader(serial.getInputStream()));
t.start();
la SerialReader implementa Ejecutable y simplemente bucles de forma indefinida, la lectura del puerto y la construcción de los datos en paquetes de útiles antes de enviarlo a otras aplicaciones. Sin embargo, he reducido se reduce a lo siguiente simplicidad:
public void run() {
ReadableByteChannel byteChan = Channels.newChannel(in); //in = InputStream passed to SerialReader
ByteBuffer buffer = ByteBuffer.allocate(100);
while (true) {
try {
byteChan.read(buffer);
} catch (Exception e) {
System.out.println(e);
}
}
}
Cuando un usuario hace clic en un botón de parada, los siguientes incendios de funcionalidad que en teoría debería cerrar el flujo de entrada y romper el bloqueo (byteChan.read buffer) llamada. El código es el siguiente:
public void stop() {
t.interrupt();
serial.close();
}
Sin embargo, cuando ejecuta este código, nunca consigo una ClosedByInterruptException, que debe disparar una vez que el flujo de entrada se cierra. Además, la ejecución bloquea la llamada a serial.close() porque la secuencia de entrada subyacente todavía está bloqueando en la llamada de lectura. He intentado reemplazar la llamada de interrupción con byteChan.close(), que luego debería causar una AsynchronousCloseException, sin embargo, obtengo los mismos resultados.
Me agradecería cualquier ayuda sobre lo que me estoy perdiendo.
Esto definitivamente funciona. Gracias. –